瀏覽代碼

Merge branch '1.0.0_online' of http://smartcost.f3322.net:3000/SmartCost/ConstructionCost into 1.0.0_online

zhongzewei 7 年之前
父節點
當前提交
c5efd22c19

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

@@ -132,6 +132,21 @@ let mExport = {
             }
         });
     },
+    getTplTreeByCompilation: function (req, res) {
+        let params = JSON.parse(req.body.params),
+            compilationId = params.compilationId;
+        // if (req.session.sessionUser && req.session.sessionUser.id) sessionUserId = req.session.sessionUser.id;
+        if (!compilationId) {
+            compilationId = req.session.sessionCompilation._id;
+        }
+        rttFacade.findTplTreeByCompilation(compilationId).then(function(result) {
+            if (result) {
+                callback(req,res,false,"", result);
+            } else {
+                callback(req,res, true,"no result", null);
+            }
+        });
+    },
     updateTreeNodes: function(req, res) {
         let params = JSON.parse(req.body.params),
             nodes = params.nodes;
@@ -268,30 +283,6 @@ let mExport = {
             })
         }
     },
-    // createTplTreeNode: function(req, res){
-    //     let params = JSON.parse(req.body.params),
-    //         lastNodeId = params.lastNodeId,
-    //         nodeData = params.rawNodeData;
-    //     counter.counterDAO.getIDAfterCount(counter.moduleName.report, 1, function(err, result){
-    //         nodeData.ID = result.value.sequence_value;
-    //         let node = new TreeNodeModel(nodeData);
-    //         node.save(function (err, result) {
-    //             if (err) {
-    //                 callback(req,res, "树节点错误!", "", null);
-    //             } else {
-    //                 if (lastNodeId > 0) {
-    //                     TreeNodeModel.update({ID: lastNodeId}, {"NextSiblingID": nodeData.ID}, function(err, rst){
-    //                         if (err) {
-    //                             callback(req,res, "树节点错误!", "", null);
-    //                         } else {
-    //                             callback(req,res, false, "", result);
-    //                         }
-    //                     });
-    //                 } else callback(req,res, false, "", result);
-    //             }
-    //         });
-    //     });
-    // },
     getNewNodeID: function(req, res) {
         let params = JSON.parse(req.body.params),
             scope = params.scope;
@@ -324,7 +315,6 @@ let mExport = {
                     if (err) {
                         callback(req,res, "报表模板创建错误", "", null);
                     } else {
-                        //TreeNodeModel.update();
                         let filter = {"compilationId": compilationId, "engineerId": engineerId, "userId": userId, "items.ID": subNode.ID, "$or": [{"isDeleted": null}, {"isDeleted": false}]};
                         let updateStatement = {$set: {"items.$": subNode}};
                         rttFacade.updateTreeInDetail(filter, updateStatement).then(function (rst) {

+ 13 - 7
modules/reports/facade/rpt_tpl_tree_node_facade.js

@@ -65,15 +65,21 @@ async function findTplTreeByOid(objectId) {
     } else return null;
 }
 
+async function findTplTreeByCompilation(compilationId) {
+    let filter = {"compilationId": compilationId, "$or": [{"isDeleted": null}, {"isDeleted": false}]};
+    return await rpt_tpl_tree_mdl.find(filter);
+}
+
 
 let expObj = {
-    createNewTree:          createNewTree,
-    updateTree:             updateTree,
-    updateTreeInDetail:     updateTreeInDetail,
-    removeTree:             removeTree,
-    removeTreePhycically:   removeTreePhycically,
-    findTplTree:            findTplTree,
-    findTplTreeByOid:       findTplTreeByOid
+    createNewTree:              createNewTree,
+    updateTree:                 updateTree,
+    updateTreeInDetail:         updateTreeInDetail,
+    removeTree:                 removeTree,
+    removeTreePhycically:       removeTreePhycically,
+    findTplTree:                findTplTree,
+    findTplTreeByOid:           findTplTreeByOid,
+    findTplTreeByCompilation:   findTplTreeByCompilation
 };
 
 export {expObj as default};

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

@@ -21,6 +21,7 @@ module.exports = function (app) {
     rptTplRouter.post('/updateSubLevelOneNode', reportTplController.updateSubLevelOneNode);
     rptTplRouter.post('/removeTreeRootNode', reportTplController.removeTreeRootNode);
     rptTplRouter.post('/getRptTplTree', reportTplController.getRptTplTree);
+    rptTplRouter.post('/getTplTreeByCompilation', reportTplController.getTplTreeByCompilation);
     rptTplRouter.post('/getNewNodeID', reportTplController.getNewNodeID);
     rptTplRouter.post('/updateRptTplNodes', reportTplController.updateTreeNodes);
     rptTplRouter.post('/deleteRptTplNodes', reportTplController.deleteRptTplNodes);

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

@@ -146,6 +146,9 @@ var sheetCommonObj = {
         for (var row = 0; row < data.length; row++) {
             //var cell = sheet.getCell(row, col, GC.Spread.Sheets.SheetArea.viewport);
             this.showRowData(sheet,setting,row,data,distTypeTree);
+            if(setting.style){
+                sheet.setStyle(row, -1, setting.style);
+            }
         }
         this.lockCells(sheet,setting);
         sheet.resumeEvent();

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

@@ -58,6 +58,7 @@ var SheetDataHelper = {
         spread.options.allowUserEditFormula = false;
         spread.options.showDragFillSmartTag = false;
         spread.options.defaultDragFillType = GC.Spread.Sheets.Fill.AutoFillType.fillWithoutFormatting;
+        spread.getActiveSheet().options.clipBoardOptions = GC.Spread.Sheets.ClipboardPasteOptions.values;//设置粘贴时只粘贴值,不粘贴样式和公式等
         spread.getActiveSheet().setRowCount(3);
         return spread;
     },

+ 27 - 20
public/web/tree_sheet/tree_sheet_helper.js

@@ -159,18 +159,23 @@ var TREE_SHEET_HELPER = {
                     return data;
                 };
                 if(sheet.name()=="mainSheet"){
-                    if(colSetting.data.field=="quantity"){
+                 /*   if(colSetting.data.field=="quantity"){  2018-08-06 去掉工程量列表达式
                         let tag = node.data.quantityEXP?node.data.quantityEXP:'';
                         sheet.setTag(iRow, iCol,tag);
-                    }
+                    }*/
                     if(colSetting.data.field=="code"){
-                        let tag = node.data.adjustState?node.data.adjustState:'';
+                        let tag ="";
+                        if(node.sourceType == ModuleNames.ration){//定额的时候换算子目
+                            tag = node.data.adjustState?node.data.adjustState:'';
+                        }else if(node.sourceType == ModuleNames.bills &&projectObj.ifItemCharHiden(setting)){//清单、并且项目特征列隐藏的时候悬浮提示
+                            tag = node.data.itemCharacterText?node.data.itemCharacterText:'';
+                        }
                         sheet.setTag(iRow, iCol,tag);
                     }
-                    if(colSetting.data.field=="name"){
+                    /*if(colSetting.data.field=="name"){ 2018-08-06 改成在编号列悬浮提示
                         let tag = node.data.itemCharacterText?node.data.itemCharacterText:'';
                         sheet.setTag(iRow, iCol,tag);
-                    }
+                    }*/
 
                 }
 
@@ -375,7 +380,7 @@ var TREE_SHEET_HELPER = {
         TreeNodeCellType.prototype.processMouseEnter = function(hitinfo){
             let text = hitinfo.sheet.getText(hitinfo.row, hitinfo.col);
             let tag = hitinfo.sheet.getTag(hitinfo.row, hitinfo.col);
-            if(tag){
+            if(tag&&tag!=''){
                 TREE_SHEET_HELPER.showTipsDiv(tag,setting,hitinfo);
             }
         };
@@ -413,10 +418,10 @@ var TREE_SHEET_HELPER = {
             let cellWidth = hitinfo.sheet.getCell(-1, hitinfo.col).width();
             let dataField = setting.cols[hitinfo.col].data.field;
 
-            if(tag==''&&hitinfo.sheet.getCell(hitinfo.row,hitinfo.col).wordWrap()==true){//显示其它列的标记为空并且设置了自动换行
+            if((tag==undefined||tag=='')&&hitinfo.sheet.getCell(hitinfo.row,hitinfo.col).wordWrap()==true){//显示其它列的标记为空并且设置了自动换行
                 return;
             }
-            if(dataField === 'itemCharacterText' || dataField === 'jobContentText' || dataField === 'adjustState'){
+            if(dataField === 'itemCharacterText' || dataField === 'jobContentText' || dataField === 'adjustState'||dataField=="name"){
                 if((hitinfo.sheet.getParent() === projectObj.mainSpread||hitinfo.sheet.getParent() === tender_obj.tenderSpread) && textLength <= cellWidth)
                  return;
             }
@@ -424,13 +429,13 @@ var TREE_SHEET_HELPER = {
             if(hitinfo.sheet.name()=="mainSheet"){
                 if(dataField=="quantity"){//显示工程量明细
                     text = tag;
-                }if(dataField=="name"){//项目特征及内容隐藏时,显示特征及内容
-                    if(projectObj.ifItemCharHiden(setting)&&tag!=''){
-                        text = tag;
-                    }else if(textLength <= cellWidth){
-                        return;
-                    }
-                }
+                }/*if(dataField=="name"){//项目特征及内容隐藏时,显示特征及内容
+                 if(projectObj.ifItemCharHiden(setting)&&tag!=''){
+                 text = tag;
+                 }else if(textLength <= cellWidth){
+                 return;
+                 }
+                 }*/
                 else if(tag !== undefined && tag) {
                     text = tag;
                 }
@@ -478,10 +483,11 @@ var TREE_SHEET_HELPER = {
                 if (!div) {
                     div = document.createElement("div");
                     $(div).css("position", "absolute")
-                        .css("border", "1px #C0C0C0 solid")
-                        .css("box-shadow", "1px 2px 5px rgba(0,0,0,0.4)")
+                        .css("border", "1px #000000 solid")
+                        .css("box-shadow", "1px 2px 5px rgba(0,0,0,0)")
                         .css("font", "0.9rem Calibri")
-                        .css("background", "White")
+                        .css("background", "#000000")
+  						.css("color",'#FFFFFF')
                         .css("padding", 5)
                         .attr("id", 'autoTip');
                     $(div).hide();
@@ -492,7 +498,8 @@ var TREE_SHEET_HELPER = {
                 if(hitinfo.sheet && hitinfo.sheet.getParent().qo){
                     setting.pos = SheetDataHelper.getObjPos(hitinfo.sheet.getParent().qo);
                 }
-                $(this._toolTipElement).text(text);
+                if(text) text = replaceAll(/[\n]/,'<br>',text);
+                $(this._toolTipElement).html(text);
                 //清单指引、清单库做特殊处理
                 if($(hitinfo.sheet.getParent().qo).attr('id') === 'stdBillsSpread' || $(hitinfo.sheet.getParent().qo).attr('id') === 'billsGuidance_bills'){
                     $(this._toolTipElement).css('top', '').css('left', '').css('width', '');
@@ -503,7 +510,7 @@ var TREE_SHEET_HELPER = {
                     $(this._toolTipElement).css("top", setting.pos.y + hitinfo.y + 15).css("left", marginLeftMouse ? setting.pos.x + marginLeftMouse : setting.pos.x);
                 }
                 else {
-                    $(this._toolTipElement).css("top", setting.pos.y + hitinfo.y + 15).css("left", setting.pos.x + hitinfo.x + 15);
+                    $(this._toolTipElement).css("top", setting.pos.y + hitinfo.cellRect.y -$(this._toolTipElement).height()-10 ).css("left", setting.pos.x + hitinfo.cellRect.x + hitinfo.cellRect.width);
                 }
                 $(this._toolTipElement).show("fast");
                 TREE_SHEET_HELPER.tipDiv = 'show';//做个标记

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

@@ -158,7 +158,7 @@
                               <!-- Tab panes -->
                               <div class="tab-content" id="tabCon">
                                   <div class="tab-pane active" id="subItems" role="tabpanel">
-                                      <div class="main-data-bottom ovf-hidden" id="subSpread" style="display: none">
+                                      <div class="main-data-bottom ovf-hidden" id="subSpread" style="display: none" tabindex="0">
                                       </div>
                                       <div class="main-data-bottom ovf-hidden" id="tabZMHS" style="display: none">
                                           <div class=" main-data-bottom ovf-hidden" style="width: 50%; float: left; margin: 0; padding:0;" id="coeSpread"></div>

+ 22 - 15
web/building_saas/main/js/models/fee_rate.js

@@ -381,22 +381,29 @@ var FeeRate = {
         FeeRate.prototype.updateFeeRateFromBills=function(value,node){
             var me =this;
             if(node.sourceType === project.Bills.getSourceType()){
-                var fee_value= number_util.checkNumberValue(value,getDecimal("feeRate"));
-                if(fee_value!=null){
-                    var bill = node.data;
-                    var rate =me.getFeeRateByID(bill.feeRateID);
-                    var data=me.getfbUpdateData(rate,bill,fee_value,value);
-                    if(data==null){//只更改清单的值的情况下,由计算程序更新
-                        project.calcProgram.calcAndSave(node);
-                    }
-                    this.setFeeRateToBill(data,function (result) {
-                        if(data.hasOwnProperty('feeRate')){
-                            rate.rate=fee_value;
-                            me.onFeeRateChange(rate.ID,fee_value);
-                        }
-                    });
+                if(value === ''||value ===null ||value === undefined){//费费为空或空字符串时,请空对应的费率值和ID
+                    node.data.feeRateID = null;
+                    node.data.feeRate = null;
+                    node.changed = true;
+                    project.calcProgram.calcAndSave(node);
                 }else {
-                    projectObj.mainController.refreshTreeNode([node]);
+                    var fee_value= number_util.checkNumberValue(value,getDecimal("feeRate"));
+                    if(fee_value!=null){
+                        var bill = node.data;
+                        var rate =me.getFeeRateByID(bill.feeRateID);
+                        var data=me.getfbUpdateData(rate,bill,fee_value,value);
+                        if(data==null){//只更改清单的值的情况下,由计算程序更新
+                            project.calcProgram.calcAndSave(node);
+                        }
+                        this.setFeeRateToBill(data,function (result) {
+                            if(data.hasOwnProperty('feeRate')){
+                                rate.rate=fee_value;
+                                me.onFeeRateChange(rate.ID,fee_value);
+                            }
+                        });
+                    }else {
+                        projectObj.mainController.refreshTreeNode([node]);
+                    }
                 }
             }
         };

+ 1 - 1
web/building_saas/main/js/models/installation_fee.js

@@ -304,7 +304,7 @@ var installation_fee = {
             }
 
             for(let tem_bx of BXs){//过滤要删除的 自动生成的补项
-                if(tem_bx.code.startsWith('BAZF')&& usedBXMap[tem_bx.ParentID]==undefined){
+                if(tem_bx.code&&tem_bx.code.startsWith('BAZF')&& usedBXMap[tem_bx.ParentID]==undefined){
                     updateData.bills.delete.push(tem_bx);
                     let b_node =  project.mainTree.getNodeByID(tem_bx.ID);
                     if(b_node){

+ 3 - 7
web/building_saas/main/js/models/project_glj.js

@@ -770,13 +770,9 @@ ProjectGLJ.prototype.getProjectGLJs = function (data,refreshPrice=true) {
     let indexList = gljKeyArray;
     for (let d of data) {
         if (d) {
-            let condition = {};
-            for (let index of indexList) {
-                if (d[index] != null && d[index] != undefined && d[index] != '') {
-                    condition[index] = d[index]
-                }
-            }
-            let glj = _.find(projectGljs, condition);
+            let glj = _.find(projectGljs, function (item) {
+                return gljOprObj.getIndex(item,indexList) == gljOprObj.getIndex(d,indexList);
+            });
             if (glj) {
                 if(refreshPrice==true){
                     d.base_price?glj.unit_price.base_price = d.base_price:'';

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

@@ -792,9 +792,9 @@ var quantity_detail = {
         };
         quantity_detail.prototype.updateRationQuantity=function(value,node,quantityEXP,editingText){
             node.data.quantityEXP = quantityEXP?quantityEXP:editingText;
-            value = scMathUtil.roundForObj(value,getDecimal("ration.quantity"));
-            value = project.quantity_detail.autoTransformQuantity(value,node);
-            value = scMathUtil.roundForObj(value,decimalObj.decimal("quantity",node))
+            //value = scMathUtil.roundForObj(value,getDecimal("ration.quantity"));
+            value = project.quantity_detail.autoTransformQuantity(value,node);//先转换再4舍5入
+            value = scMathUtil.roundForObj(value,decimalObj.decimal("quantity",node));
             node.data.quantity=value;
             if(node.parent.data.quantity&&node.parent.data.quantity!=0&&node.parent.data.quantity!=""){
                 var billQuantity = scMathUtil.roundForObj(node.parent.data.quantity,getDecimal("quantity",node.parent));

+ 28 - 30
web/building_saas/main/js/models/ration_glj.js

@@ -417,10 +417,26 @@ var ration_glj = {
             return updateData;
         };
         ration_glj.prototype.updateRationGLJByEdit = function (recode, updateField, newval, node) {
-            var me = this;
-            $.bootstrapLoading.start();
-            var callback = function (data) {
-                let initShow = false;//是否需要表格初始化显示
+            let me = this,doc = {};
+            doc[updateField] = newval;
+            me.submitChange(recode,doc,updateField,node);
+        };
+
+        ration_glj.prototype.submitChange = function(recode,updateData,updateField,node){
+            let me = this;
+            let query = {
+                'ID': recode.ID,
+                'projectID': recode.projectID,
+                'rationID': recode.rationID
+            };
+            let priceInfo = {
+                base_price: recode.basePrice,
+                market_price: recode.marketPrice
+            };
+            if(updateData['type'] != undefined || updateData['type'] != null){
+                updateData.shortName = projectObj.project.projectGLJ.getShortNameByID(updateData['type']);
+            }
+            let callback = function (data) {
                 if (updateField == 'customQuantity') {
                     me.refreshAfterQuantityUpdate(data, node);
                 } else {
@@ -429,50 +445,32 @@ var ration_glj = {
                         recode[key] = doc[key];
                     }
                     me.refreshRationAfterEdit(data,recode.rationID, node);//更新名称和定额调整状态
-                    if (recode.subList && recode.subList.length > 0) {
-                        initShow = true;
-                    }
                     if (node) {//如果不是在造价书页面直接编辑,则不用刷新
-                        if (updateField == "type" && !(newval == gljType.MAIN_MATERIAL || newval == gljType.EQUIPMENT)) {//如果改变类型后不是主材或设备,则在造价书树中移除
+                        if (updateField == "type" && !(updateData['type'] == gljType.MAIN_MATERIAL || updateData['type'] == gljType.EQUIPMENT)) {//如果改变类型后不是主材或设备,则在造价书树中移除
                             projectObj.mainController.deleteNode(node, true);
                         }
                     }
                 }
-                if (initShow == false) {//不需要初始化,只需耍新当前显示就可以了
-                    gljOprObj.showRationGLJSheetData();
-                }
                 projectObj.project.projectGLJ.loadData(function () {//等项目工料机加载完成后再给用户编辑
+                    gljOprObj.refreshView();
                     me.refreshTreeNodeIfNeeded(recode);//刷新造价书上的树节点(如果需要)
                     me.reCalcWhenGLJChange(recode);//触发计算定额以及父节点
-                    if (initShow == true) {
-                        gljOprObj.refreshView();
-                    }
                     $.bootstrapLoading.end();
                     installationFeeObj.calcInstallationFee();
                 });
-            }
-            var query = {
-                'ID': recode.ID,
-                'projectID': recode.projectID,
-                'rationID': recode.rationID
             };
-            var priceInfo = {
-                base_price: recode.basePrice,
-                market_price: recode.marketPrice
-            }
-            var doc = {};
-            doc[updateField] = newval;
-            if (updateField == "type") {
-                doc.shortName = projectObj.project.projectGLJ.getShortNameByID(newval);
-            }
+            $.bootstrapLoading.start();
             CommonAjax.post("/rationGlj/updateRationGLJByEdit", {
                 query: query,
-                doc: doc,
+                doc: updateData,
                 priceInfo: priceInfo
             }, callback, function (err) {
                 $.bootstrapLoading.end();
             });
-        }
+        };
+
+
+
         ration_glj.prototype.refreshAfterQuantityUpdate = function (data, node) {
             var me = this;
             data.glj_result.forEach(function (item) {

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

@@ -18,8 +18,10 @@ let gljCol = {
             {headerName: "暂估", headerWidth: 45, dataCode: "isEstimate", dataType: "String", hAlign: "center", vAlign: "center", cellType: "checkBox"}
         ],
         view: {
-            lockColumns: [ 5, 7, 9, 10, 11]
+            lockColumns: [ 5, 7, 9, 10, 11]//这里以后改成dataCode好一点
         },
+        style:{foreColor:"#4D7BFF"},
+        navigationRightCol:['name','specs','unit'],//选中这几列时,按enter键跳到右边一列
         // 工料机类型是混凝土、砂浆、配合比、机械台班时,价格不可编辑。
         editedTyep:[GLJTypeConst.MAIN_MATERIAL,GLJTypeConst.EQUIPMENT]//主材设备
     },

+ 88 - 17
web/building_saas/main/js/views/glj_view.js

@@ -8,6 +8,8 @@ var gljOprObj = {
     ration: null,
     sheetData: [],
     checkb: null,
+    rationGljEditObj:null,//编辑定额工料机还没提交的缓存数据
+    cancelUpdate:true,
     mainTreeSelectedChange:false,
     detailSheet: null,
     detailData: [],
@@ -106,13 +108,44 @@ var gljOprObj = {
         subSpread.bind(GC.Spread.Sheets.Events.ButtonClicked, me.onButtonClick);
         if(!projectReadOnly){
             gljContextMenu.loadGLJSpreadContextMenu();
-            //me.bindGLJEnterKey(subSpread,sheet);
+            me.bindGLJEnterKey(subSpread,sheet);
         }
-        sheet.bind(GC.Spread.Sheets.Events.SelectionChanged,function (sender,args) {
-            let selected = args.newSelections[0] ? args.newSelections[0] : {row: 0, col: 0};
-            me.sheetInitSelection(selected);
+        sheet.bind(GC.Spread.Sheets.Events.SelectionChanged,me.onRationGLJSelectionChange);
+        sheet.bind(GC.Spread.Sheets.Events.CellClick,function () {
+            //这里主要记录是否点击了sheet以外的地方,如果点击了sheet里的单元格,则将cancelUpdate设置为true不触发提交更新操作
+            me.cancelUpdate = true;//取消延时任务由selection change 事件处理
         });
     },
+    onRationGLJSelectionChange:function(sender,args){
+        let me = gljOprObj;
+        let selected = args.newSelections[0] ? args.newSelections[0] : {row: 0, col: 0};
+        console.log("selected changed-------");
+        //这主要记录是否点击了sheet以外的地方,如果点击了sheet里的单元格,则将cancelUpdate设置为true不触发提交更新操作
+        me.cancelUpdate = true;//取消延时任务由这里进行判断处理
+        console.log("change to true");
+        me.sheetInitSelection(selected,me.setting.style);
+        if(me.rationGljEditObj){
+            if(ifNeedUpdate(selected)){
+                me.updateGljFromCache();
+            }
+        }
+
+        function ifNeedUpdate(selected) {
+            let navigationRightCol = me.setting.navigationRightCol , fieldID = me.setting.header[selected.col].dataCode;
+            if(me.rationGljEditObj.row == selected.row && navigationRightCol.indexOf(fieldID)!= -1){//如果换行或者超出了三个编辑列,则提交更新
+                return false;
+            }
+            return true;
+        }
+    },
+
+    updateGljFromCache:function () {
+        let me = this;
+        if(me.rationGljEditObj){
+            projectObj.project.ration_glj.submitChange(me.rationGljEditObj.recode, me.rationGljEditObj.doc);
+        }
+        me.rationGljEditObj = null;
+    },
 
     bindGLJEnterKey:function (spread,sheet) {
         let me = this;
@@ -122,21 +155,24 @@ var gljOprObj = {
 
         function enterKeyAction(spd,sheeName) {
             let editRow = sheet.getActiveRowIndex(),orgCol = sheet.getActiveColumnIndex();
-            if(sheet.isEditing()) sheet.endEdit();
-             //GC.Spread.Sheets.Commands.commitInputNavigationDown.execute(spd,sheeName);
-            //sheet.setSelection(editRow,orgCol+1,1,1);
-            GC.Spread.Sheets.Commands.navigationRight.execute(spd,sheeName);
-            //sheet.setActiveCell(editRow, orgCol+1)
+            let fieldID = me.setting.header[orgCol].dataCode;
+            if(me.setting.navigationRightCol.indexOf(fieldID) != -1){
+                if(sheet.isEditing()) sheet.endEdit();
+                GC.Spread.Sheets.Commands.navigationRight.execute(spd,sheeName);
+            }else {
+                GC.Spread.Sheets.Commands.commitInputNavigationDown.execute(spd,sheeName);
+            }
+
         }
     },
-    sheetInitSelection: function (selected) {
+    sheetInitSelection: function (selected,style) {
         let me = gljOprObj;
         if(selected.row < me.sheetData.length){
-            me.sheet.setStyle(selected.row, -1, me.getSelStyle(true));
+            me.sheet.setStyle(selected.row, -1, me.getSelStyle(true,style));
         }
         me.sheet.repaint();
         if(me.preGljSelection && me.preGljSelection.row !== selected.row){
-            me.sheet.setStyle(me.preGljSelection.row, -1, me.getSelStyle(false));
+            me.sheet.setStyle(me.preGljSelection.row, -1, me.getSelStyle(false,style));
         }
         me.preGljSelection = selected;
     },
@@ -266,8 +302,13 @@ var gljOprObj = {
         let me = gljOprObj;
         me.initSelection(args.newSelections.length > 0 ? {row: args.newSelections[0].row} : {row: 0});
     },
-    getSelStyle: function (selected) {
+    getSelStyle: function (selected,settingStyle) {
         let style = new GC.Spread.Sheets.Style();
+        if(settingStyle){
+            for(let key in settingStyle){
+                style[key] = settingStyle[key];
+            }
+        }
         style.borderLeft = new GC.Spread.Sheets.LineBorder("#D4D4D4", GC.Spread.Sheets.LineStyle.thin);
         style.borderTop = new GC.Spread.Sheets.LineBorder("#D4D4D4", GC.Spread.Sheets.LineStyle.thin);
         style.borderRight = new GC.Spread.Sheets.LineBorder("#D4D4D4", GC.Spread.Sheets.LineStyle.thin);
@@ -453,7 +494,7 @@ var gljOprObj = {
     showDataIfRationSelect: function (node,selectedNodeId) {
         var isShow = false;
         //恢复底色
-        this.sheet.setStyle(this.sheet.getActiveRowIndex(), -1, this.getSelStyle(false));
+        this.sheet.setStyle(this.sheet.getActiveRowIndex(), -1, this.getSelStyle(false,this.setting.style));
         if(projectReadOnly && this.setting.view.lockColumns){
             this.setting.view.lockColumns = null;
         }
@@ -524,7 +565,7 @@ var gljOprObj = {
         sheetCommonObj.showData(this.sheet, this.setting, this.sheetData);
         //初始选择
         this.preGljSelection = null;
-        this.sheetInitSelection({row: this.sheet.getActiveRowIndex(), col: 0});
+        this.sheetInitSelection({row: this.sheet.getActiveRowIndex(), col: 0},this.setting.style);
         this.sheet.getRange(-1, 0, -1, this.setting.header.length).locked(true);//锁住定额工料机的所有列
         this.detailSheet.getRange(-1, 0, -1, this.detailSetting.header.length).locked(true);//锁住工程量明细的所有列
     },
@@ -561,7 +602,7 @@ var gljOprObj = {
         }
         //初始选择
         this.preGljSelection = null;
-        this.sheetInitSelection({row: this.sheet.getActiveRowIndex(), col: this.sheet.getActiveColumnIndex()});
+        this.sheetInitSelection({row: this.sheet.getActiveRowIndex(), col: this.sheet.getActiveColumnIndex()},this.setting.style);
 
     },
     getUnitPriceCodeMap : function () {//取单价文件中,编码前缀一样的映射表
@@ -781,7 +822,6 @@ var gljOprObj = {
                 }
                 this.setGLJPrice(tem,pg);
             }
-
             temRationGLJs.push(tem);
         }
         temRationGLJs = _.sortBy(temRationGLJs, 'code');
@@ -854,10 +894,27 @@ var gljOprObj = {
             projectObj.project.projectGLJ.updatePriceFromRG(recode, updateField, newval);
         }else if(updateField == 'code'){//替换单价文件中已经有的工料机
             projectObj.project.ration_glj.updateRationGLJByChangeCode(recode, updateField, newval);
+        }else if(me.setting.navigationRightCol.indexOf(updateField) != -1){//对于名称、规格、单位先跳到下一列,保存至缓存
+            me.setToEditCache(recode,updateField, newval,args);
         } else {
             projectObj.project.ration_glj.updateRationGLJByEdit(recode, updateField, newval);
         }
     },
+    setToEditCache:function(recode,updateField,value,args){
+        let me = this;
+        if(me.rationGljEditObj == null){
+            me.rationGljEditObj = {
+                recode:recode,
+                doc:{},
+                row:args.row
+            }
+            me.rationGljEditObj.doc[updateField] = value;
+        }else {
+            if(me.rationGljEditObj.recode.ID == recode.ID){//确保编辑的是同一条数据
+                me.rationGljEditObj.doc[updateField] = value;
+            }
+        }
+    },
     isRationGLJExit:function (connectKey) {
         for(let rg of gljOprObj.sheetData){
             if(rg.isMixRatio == true){
@@ -1539,6 +1596,20 @@ $(function () {
         $('#selected_class').val("");
     })
 
+
+    $("#subSpread").focusout(function(e){//当本身或子元素失去焦点时这个事件都会发生,而且不好判断点击的是哪里。
+        if(gljOprObj.rationGljEditObj){
+            gljOprObj.cancelUpdate = false;
+            gljOprObj.timeStamp = e.timeStamp;//设置时间戳,有可能用户在表格上乱点,这个事件被触发多次
+            setTimeout(function () {//延时执行提交操作,如果点击的是spread里的地方,会把cancelUpdate改成true,这样的话就不执行提交操作
+                if(gljOprObj.timeStamp == e.timeStamp && gljOprObj.cancelUpdate  !== true){//时间戳要相同
+                    gljOprObj.updateGljFromCache();
+                }
+            },200)
+        }
+    });
+
+
     function getcmpUpdateData(items) {
         var data = {
             "updateItems": [],

+ 16 - 12
web/building_saas/main/js/views/project_view.js

@@ -35,7 +35,7 @@ var projectObj = {
         if($('#linkComments').hasClass('active')){
             subViewObj.loadComments(node);
         }
-        gljOprObj.mainTreeSelectedChange = true;
+        gljOprObj.mainTreeSelectedChange = gljOprObj.selectedNodeId != node.getID();
         gljOprObj.showDataIfRationSelect(node);
         if (activeSubSheetIsCalcProgram())
             calcProgramObj.refreshCalcProgram(node, 3);
@@ -565,18 +565,19 @@ var projectObj = {
     },
     onCellDoubleClick: function (sender, info){
         let project = projectObj.project;
-        let node = project.mainTree.items[info.row];
-        let fieldName = projectObj.mainController.setting.cols[info.col].data.field;
-        if(fieldName == 'marketUnitFee'){
-            if(gljOprObj.hasComposition(node.data,true)){
-                alert("当前人材机的市场价由组成物计算得出,不可直接修改。");
-                return;
+        if(info.row && info.col){
+            let node = project.mainTree.items[info.row];
+            let fieldName = projectObj.mainController.setting.cols[info.col].data.field;
+            if(fieldName == 'marketUnitFee'){
+                if(gljOprObj.hasComposition(node.data,true)){
+                    alert("当前人材机的市场价由组成物计算得出,不可直接修改。");
+                    return;
+                }
+            }
+            if(fieldName == 'code' && node){
+                projectObj.showBillOrRationLib(node)
             }
         }
-        if(fieldName == 'code' && node){
-            projectObj.showBillOrRationLib(node)
-        }
-
     },
     showBillOrRationLib(node){
         let BILLS = projectObj.project.Bills;
@@ -2722,13 +2723,16 @@ $(function () {
         $('#uploadSheetsHead').hide();
     });
 
-    $("#billsSpread").mouseover(function(){
+   /* $("#billsSpread").mouseover(function(){
         spreadAutoFocus(projectObj.mainSpread,subSpread);
     });
 
     $("#subSpread").mouseover(function(){
         spreadAutoFocus(subSpread,projectObj.mainSpread);
     });
+*/
+
+
 
     $("#paste_confirm").click(function (){
         let selected = projectObj.project.mainTree.selected;