瀏覽代碼

Merge branch '1.0.0_online' of http://192.168.1.12:3000/SmartCost/ConstructionCost into 1.0.0_online

TonyKang 7 年之前
父節點
當前提交
7f2edf65ca

+ 13 - 5
public/web/common_ajax.js

@@ -27,7 +27,7 @@ var CommonAjax = {
                 }
             },
             error: function(jqXHR, textStatus, errorThrown){
-                alert('url: ' + url +' error ' + textStatus + " " + errorThrown);
+                ajaxErrorInfo(jqXHR, textStatus, errorThrown);
                 if (errorCallback) {
                     errorCallback();
                 }
@@ -55,7 +55,7 @@ var CommonAjax = {
                 }
             },
             error: function(jqXHR, textStatus, errorThrown){
-                alert('error ' + textStatus + " " + errorThrown);
+                ajaxErrorInfo(jqXHR, textStatus, errorThrown);
                 if (errorCallback) {
                     errorCallback();
                 }
@@ -84,7 +84,7 @@ var CommonAjax = {
                 }
             },
             error: function(jqXHR, textStatus, errorThrown){
-                alert('url: ' + url +' error ' + textStatus + " " + errorThrown);
+                ajaxErrorInfo(jqXHR, textStatus, errorThrown);
                 if (exceptionCallback) {
                     exceptionCallback();
                 }
@@ -97,8 +97,8 @@ var CommonAjax = {
             type: 'post',
             data: data,
             dataType: 'json',
-            error: function() {
-                alert('数据传输有误!');
+            error: function(jqXHR, textStatus, errorThrown) {
+                ajaxErrorInfo(jqXHR, textStatus, errorThrown);
                 if (errorCallback) {
                     errorCallback();
                 }
@@ -143,4 +143,12 @@ function getTopWindow() {
         p = p.parent;
     }
     return p;
+}
+
+function ajaxErrorInfo(jqXHR, textStatus, errorThrown) {
+    if(textStatus == 'timeout'){
+        alert('网络连接超时,请刷新您的网页。');
+    }else {
+        alert('url: ' + url +' error ' + textStatus + " " + errorThrown);
+    }
 }

+ 9 - 4
web/building_saas/css/main.css

@@ -30,7 +30,7 @@ body {
     margin-right: 1rem;
     font-size: 1rem;
     height:38px;
-    background:url("/web/building_saas/css/logo.png") no-repeat 0 0;
+    background:url(logo.png) no-repeat 0 0;
     padding-left:40px;
 }
 .header-logo div.v-title{
@@ -85,7 +85,9 @@ body {
     background:#f7f7f9
 }
 .poj-cate {
-    width:58px
+    width:58px;
+    margin-right:-1px;
+    margin-top:2px;
 }
 .poj-cate .nav-pills .nav-link{
     border-radius: 0;
@@ -101,10 +103,13 @@ body {
 }
 .pm-side{
     position: fixed;
-    left:0
+    left:0;
+    height:100%;
+    border-right:1px solid #ccc;
+    background: #f7f7f9
 }
 .pm-content{
-    padding-left:48px
+    padding-left:58px
 }
 .content {
     border-left: 1px solid #ccc;

+ 6 - 6
web/building_saas/fee_rates/fee_rate.js

@@ -33,8 +33,8 @@ function loadProjectFeeRates(fileID) {
                 createSpreadView(true);
             }
         },
-        error: function (result) {
-            alert('内部程序错误!');
+        error: function (jqXHR, textStatus, errorThrown) {
+            ajaxErrorInfo(jqXHR, textStatus, errorThrown);
         }
     });
 }
@@ -55,8 +55,8 @@ function loadStdFeeRateLibNames(region) {
                 $("#inlineFormCustomSelect").get(0).selectedIndex = 0;
             }
         },
-        error: function (result) {
-            alert('内部程序错误!');
+        error: function (jqXHR, textStatus, errorThrown) {
+            ajaxErrorInfo(jqXHR, textStatus, errorThrown);
         }
     });
 }
@@ -72,8 +72,8 @@ function loadLibFeeRates(libID) {
                 createSpreadView(false);
             }
         },
-        error: function (result) {
-            alert('内部程序错误!');
+        error: function (jqXHR, textStatus, errorThrown) {
+            ajaxErrorInfo(jqXHR, textStatus, errorThrown);
         }
     });
 }

+ 6 - 4
web/building_saas/glj/js/composition_spread.js

@@ -124,7 +124,8 @@ CompositionSpread.prototype.getRatioData = function(projectGLJid) {
         url: '/glj/get-ratio',
         type: 'post',
         data: {id: projectGLJid, project_id: scUrlUtil.GetQueryString('project')},
-        error: function() {
+        error: function(jqXHR, textStatus, errorThrown) {
+            ajaxErrorInfo(jqXHR, textStatus, errorThrown);
             self.sheetObj.setData(null);
         },
         beforeSend: function() {
@@ -213,8 +214,8 @@ CompositionSpread.prototype.updateConsumption = function(info, callback) {
         type: 'post',
         data: {id: id, field: 'mix_ratio.' + field, value: value, market_price: parentMarketPrice, base_price: parentBasePrice},
         dataType: 'json',
-        error: function() {
-            alert('数据传输有误!');
+        error: function(jqXHR, textStatus, errorThrown) {
+            ajaxErrorInfo(jqXHR, textStatus, errorThrown);
             self.isChanging = false;
             activeSheet.setValue(row, column, info.oldValue);
         },
@@ -308,7 +309,8 @@ CompositionSpread.prototype.deleteComposition = function (id, row, callback) {
         type: 'post',
         data: {id: id},
         dataType: 'json',
-        error: function() {
+        error: function(jqXHR, textStatus, errorThrown) {
+            ajaxErrorInfo(jqXHR, textStatus, errorThrown);
             isDeleting = false;
             alert('服务器繁忙');
         },

+ 2 - 2
web/building_saas/glj/js/project_glj_spread.js

@@ -244,8 +244,8 @@ ProjectGLJSpread.prototype.postUpdate=function (id,field,value,info,extend,callb
         type: 'post',
         data: {id: id, field: field, value: value, extend: extend},
         dataType: 'json',
-        error: function() {
-            alert('数据传输有误!');
+        error: function(jqXHR, textStatus, errorThrown) {
+            ajaxErrorInfo(jqXHR, textStatus, errorThrown);
             isChanging = false;
         },
         beforeSend: function() {

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

@@ -638,7 +638,7 @@
                                                     </div>
                                                 </div>
                                             </div>
-                                            <h5 class="mt-3">工料机</h5>
+                                            <h5 class="mt-3">人材机</h5>
                                             <div class="row m-0">
                                                 <div class="col-sm-3">
                                                     <div class="input-group input-group-sm mb-2">

+ 1 - 4
web/building_saas/main/js/controllers/block_controller.js

@@ -607,10 +607,7 @@ let BlockController = {
         return selected.sourceType == projectObj.project.Bills.getSourceType() && selected.data.type == billType.FB;
     },
     isFXorBX:function (selected) {//是分项或者补项
-        if(selected.sourceType == projectObj.project.Bills.getSourceType()){
-            return   selected.data.type == billType.FX || selected.data.type == billType.BX;
-        }
-        return false;
+        return projectObj.project.Bills.isFXorBX(selected);
     },
     blockIsFXorBX: function (type) {
         return type == blockType.FX||type == blockType.BX;

+ 6 - 4
web/building_saas/main/js/controllers/project_controller.js

@@ -114,6 +114,7 @@ ProjectController = {
             newNode.data = newSource.data;
 
             this.syncDisplayNewNode(sheetController, newNode);
+            return newNode;
         }
         function getSubType(node){
             for(let sub of node.children){
@@ -135,10 +136,10 @@ ProjectController = {
         if (!project || !sheetController) { return null; }
         let selected = project.mainTree.selected;
         if(selected.parent==null&&isFlag(selected.data)&&selected.data.flagsIndex.fixed.flag==fixedFlag.SUB_ENGINERRING){//选中的是分部分项,则插入做为最后一个子项
-            this.addSpecialBill(project, sheetController,selected, null,true,billType.FB);
+            return this.addSpecialBill(project, sheetController,selected, null,true,billType.FB);
         }
         if(selected.parent){
-            this.addSpecialBill(project, sheetController,selected.parent, selected.nextSibling,true,billType.FB);
+            return this.addSpecialBill(project, sheetController,selected.parent, selected.nextSibling,true,billType.FB);
         }
 
     },
@@ -147,11 +148,11 @@ ProjectController = {
         let selected = project.mainTree.selected;
         console.log(selected);
         if(selected.data.type==billType.FB||(selected.parent==null&&isFlag(selected.data)&&selected.data.flagsIndex.fixed.flag==fixedFlag.SUB_ENGINERRING)){//选中的是分部或者是分部分项工程,则插入做为最后一个子项
-            this.addSpecialBill(project, sheetController,selected, null,true,billType.FX);
+            return this.addSpecialBill(project, sheetController,selected, null,true,billType.FX);
         }
         if(selected.parent){
             if(selected.data.type==billType.FX||selected.data.type==billType.BX){
-                this.addSpecialBill(project, sheetController,selected.parent, selected.nextSibling,true,billType.FX);
+                return this.addSpecialBill(project, sheetController,selected.parent, selected.nextSibling,true,billType.FX);
             }
         }
     },
@@ -169,6 +170,7 @@ ProjectController = {
             newNode.sourceType = project.Bills.getSourceType();
             newNode.data = newSource.data;
             this.syncDisplayNewNode(sheetController, newNode);
+            return newNode;
         }
     },
 

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

@@ -506,6 +506,12 @@ var Bills = {
                 return false;
             }
         };
+        bills.prototype.isFXorBX=function (node) {//是分项或者补项
+            if(node.sourceType == projectObj.project.Bills.getSourceType()){
+                return   node.data.type == billType.FX || node.data.type == billType.BX;
+            }
+            return false;
+        };
         bills.prototype.nodeFlagCheck = function (node,fixedFlag) {//判断节点类型
             let flagCheck = function (checkNode) {
                 if(isFlag(checkNode.data)&&checkNode.data.flagsIndex.fixed.flag==fixedFlag){

+ 28 - 8
web/building_saas/main/js/models/calc_program.js

@@ -112,8 +112,20 @@ let calcTools = {
             treeNode.source.children &&
             treeNode.source.children.length === 0;
     },
-    isbigBill: function(treeNode){
-        return this.isBill(treeNode) && treeNode.data.type == 1;
+    isBill_DXFY: function(treeNode){
+        return this.isBill(treeNode) && treeNode.data.type == billType.DXFY;
+    },
+    isBill_FB: function(treeNode){
+        return this.isBill(treeNode) && treeNode.data.type == billType.FB;
+    },
+    isBill_FX: function(treeNode){
+        return this.isBill(treeNode) && treeNode.data.type == billType.FX;
+    },
+    isBill_BILL: function(treeNode){
+        return this.isBill(treeNode) && treeNode.data.type == billType.BILL;
+    },
+    isBill_BX: function(treeNode){
+        return this.isBill(treeNode) && treeNode.data.type == billType.BX;
     },
     isNullBill: function (treeNode) {
         return this.isLeafBill(treeNode) && (treeNode.children.length === 0) && (!treeNode.data.calcBase);
@@ -137,6 +149,13 @@ let calcTools = {
     isGljRation: function (treeNode) {
         return this.isRationCategory(treeNode) && treeNode.data.type === rationType.gljRation;
     },
+    isSameTypeNode: function (node1, node2) {
+        if (node1.parent && node2.parent && (node1.parent === node2.parent) && (node1.sourceType === node1.sourceType)
+            && (node1.data && node2.data && node1.data.type === node2.data.type)){
+            return true;
+        }
+        return false;
+    },
     isInheritFrom: function (treeNode, flagsArr){
         let cur = treeNode;
         while (cur.parent) {
@@ -279,10 +298,10 @@ let calcTools = {
                 let aprice = calcTools.hasAdjustPrice() ? me.uiGLJPrice(glj["adjustPrice"], glj) : me.uiGLJPrice(glj["basePrice"], glj);
 
                 if (priceType == priceTypes.ptDiffPrice){
-                    if (aprice != mprice){
+                    // if (aprice != mprice){
                         temp = (temp + (qty * mprice).toDecimal(decimalObj.process)).toDecimal(decimalObj.process);
                         temp2 = (temp2 + (qty * aprice).toDecimal(decimalObj.process)).toDecimal(decimalObj.process);
-                    }
+                    // }
                 }
                 else {
                     if (priceType == priceTypes.ptBasePrice){ price = me.uiGLJPrice(glj["basePrice"], glj);}
@@ -324,12 +343,13 @@ let calcTools = {
                     if (md.type == gljType.MACHINE_LABOUR) {
                         let q = md["consumption"] ? md["consumption"] : 0;
                         let p = md["basePrice"] ? md["basePrice"] : 0;
-                        mdSum = mdSum + (q * p).toDecimal(decimalObj.ration.unitPrice);
-                        mdSum = (mdSum).toDecimal(decimalObj.ration.unitPrice);
+                        mdSum = mdSum + (q * p).toDecimal(decimalObj.glj.unitPriceHasMix);
+                        mdSum = (mdSum).toDecimal(decimalObj.glj.unitPriceHasMix);
                     }
                 }
-                result = result + (gljQ * mdSum).toDecimal(decimalObj.process);
-                result = (result).toDecimal(decimalObj.process);
+                // result = result + (gljQ * mdSum).toDecimal(decimalObj.process);
+                result = result + (gljQ * mdSum).toDecimal(decimalObj.ration.unitPrice);
+                result = (result).toDecimal(decimalObj.ration.unitPrice);
             }
         }
         result = (result).toDecimal(decimalObj.ration.unitPrice);

+ 4 - 4
web/building_saas/main/js/models/project_glj.js

@@ -692,8 +692,8 @@ ProjectGLJ.prototype.refreshTreeNodePriceIfNeed = function (data) {
     if ((data.unit_price.type == gljType.MAIN_MATERIAL || data.unit_price.type == gljType.EQUIPMENT) && projectInfoObj.projectInfo.property.displaySetting.disPlayMainMaterial == true) {
         var nodes = _.filter(projectObj.project.mainTree.items, function (tem) {
             if (tem.sourceType == ModuleNames.ration_glj && tem.data.projectGLJID == data.id) {
-                tem.data.marketUnitFee = data.unit_price.market_price;
-                tem.data.marketPrice = data.unit_price.market_price;
+                tem.data.marketUnitFee = this.getMarketPrice(data);//data.unit_price.market_price;
+                tem.data.marketPrice = this.getMarketPrice(data);//data.unit_price.market_price;
                 return true;
             }
         })
@@ -751,8 +751,8 @@ ProjectGLJ.prototype.getImpactRationNodes = function (gljs) {
 ProjectGLJ.prototype.refreshRationGLJPrice = function (glj) {
     for (let ration_glj of gljOprObj.sheetData) {
         if (ration_glj.projectGLJID == glj.id) {
-            ration_glj.basePrice = glj.unit_price.base_price;
-            ration_glj.marketPrice = glj.unit_price.market_price;
+            ration_glj.basePrice = this.getBasePrice(glj);
+            ration_glj.marketPrice = this.getMarketPrice(glj);
             ration_glj.adjustPrice = this.getAdjustPrice(glj);
         }
     }

+ 13 - 6
web/building_saas/main/js/models/ration.js

@@ -553,10 +553,10 @@ var Ration = {
             let selected = project.mainTree.selected, newSource = null, newNode = null,pre=null,br=null;
             let billItemID = null,serialNo=1,nextID=null;
             let needInstall = false;
-            if (selected === null) { return; }
+            if (selected === null) { return null; }
             if (selected.sourceType === project.Bills.getSourceType() && selected.depth() > 0) {
                 if(selected.data.type === billType.FB){
-                    return;
+                    return null;
                 }
                 else if (selected.source.children.length > 0) {
                     alert('当前清单已有清单子项,不能套用定额。');
@@ -576,7 +576,8 @@ var Ration = {
                 pre = selected.source;
             };
             if(billItemID){
-                let newData =  me.getTempRationData(me.getNewRationID(), billItemID, serialNo, rationType);
+                let newID = me.getNewRationID();
+                let newData =  me.getTempRationData(newID, billItemID, serialNo, rationType);
                 let calQuantity =  isEmpty===true?false:optionsOprObj.getOption(optionsOprObj.optionsTypes.GENERALOPTS, 'rationQuanACToBillsQuan');
                 let brUpdate = [];
                 //更新兄弟节点的序列号
@@ -592,6 +593,9 @@ var Ration = {
                     needInstall = project.Bills.isFBFX(billsNode);//在分部分项插入的定额才需要定额安装增加费
                 }
                 $.bootstrapLoading.start();
+                newNode = project.mainTree.insert(billItemID, nextID, newID);
+                newNode.sourceType = project.Ration.getSourceType();
+                newNode.data = newData;
                 CommonAjax.post("/ration/addNewRation",{itemQuery:itemQuery,newData:newData,firstLibID: rationLibObj.getFirstStdRationLibID(),calQuantity:calQuantity,brUpdate:brUpdate,needInstall:needInstall},function (data) {
                     //更新缓存
                     me.datas.push(data.ration);
@@ -601,12 +605,12 @@ var Ration = {
 
                     //插入树节点
                     newSource = data.ration;
-                    newNode = project.mainTree.insert(billItemID, nextID, newSource.ID);
+                    // newNode = project.mainTree.insert(billItemID, nextID, newSource.ID);  上移到post方法外部。批量粘贴时,先插入空行,前端等不了,先生成树结点,效果同清单处理方式。
                     newNode.source = newSource;
-                    newNode.sourceType = project.Ration.getSourceType();
+                    // newNode.sourceType = project.Ration.getSourceType();
                     newNode.data = newSource;
                     project.projectGLJ.loadData(function () {
-                        ProjectController.syncDisplayNewNode(sheetController, newNode);
+                        // ProjectController.syncDisplayNewNode(sheetController, newNode);
                         project.ration_glj.addToMainTree(data.ration_gljs);
                         projectObj.mainController.refreshTreeNode([newNode], false);
                         project.calcProgram.calcAndSave(newNode,function () {
@@ -622,7 +626,10 @@ var Ration = {
                         $.bootstrapLoading.end();
                     });
                 })
+                ProjectController.syncDisplayNewNode(sheetController, newNode);
+                return newNode;
             }
+            else return null;
 
         };
         ration.prototype.deleteSubListOfRation = function(ration){

+ 6 - 6
web/building_saas/main/js/views/calc_base_view.js

@@ -131,13 +131,13 @@ let calcBaseView = {
     isDef: function (v) {
         return v !== undefined && v !== null;
     },
-    ifEdit: function (type) {
+    //processMouseDown触发时间比SelectionChanged早,所以直接取selected是上一个节点的,需要传row取当前选中节点
+    ifEdit: function (type, row) {
         if (type == 'ration'){
             return true;
         }
         else{
-
-            var selected = projectObj.project.mainTree.selected;
+            let selected = projectObj.project.mainTree.items[row];
             return selected && MainTreeCol.readOnly.forCalcBase(selected)?false:true;
         }
     },
@@ -345,7 +345,7 @@ let calcBaseView = {
             // ctx.fillText(value,x+w-3,y+h-3);
             GC.Spread.Sheets.CellTypes.Text.prototype.paint.apply(this, arguments);
             // }
-            if(calcBaseView.editingCell && !projectReadOnly && calcBaseView.ifEdit(type)){
+            if(calcBaseView.editingCell && !projectReadOnly && calcBaseView.ifEdit(type, options.row)){
                 if(calcBaseView.editingCell.row==options.row&&calcBaseView.editingCell.col==options.col){
                     var image = document.getElementById('f_btn'),imageMagin = 3;
                     var imageHeight = h-2*imageMagin;
@@ -381,7 +381,7 @@ let calcBaseView = {
             if(me.editingCell==null){
                 var showSelectBtn = true;
                 if(hitinfo.sheet.name()!='calc_detail'){
-                    showSelectBtn=me.ifEdit(type);
+                    showSelectBtn=me.ifEdit(type, hitinfo.row);
                 }
                 if(showSelectBtn){
                     me.editingCell={
@@ -397,7 +397,7 @@ let calcBaseView = {
                 var imageHeight = hitinfo.cellRect.height-2*imageMagin;
                 var imageWidth = hitinfo.cellRect.width*2/7;
                 if(hitinfo.x<offset&&hitinfo.x>offset-imageWidth){
-                    if(!projectReadOnly && me.ifEdit(type)){
+                    if(!projectReadOnly && me.ifEdit(type, hitinfo.row)){
                         calcBaseView.initCalctor(type);
                     }
                 }

+ 5 - 4
web/building_saas/main/js/views/fee_rate_view.js

@@ -228,6 +228,7 @@ var feeRateObject={
 
         sheet.setSelection(rowIdx, -1, 1, -1);
         sheet.showRow(rowIdx, GC.Spread.Sheets.VerticalPosition.center);
+        feeRateObject.onCellClick({type: 'CellClick'}, {row:rowIdx});
     },
     getTreeNodeCellType:function () {
         var ns = GC.Spread.Sheets;
@@ -342,7 +343,7 @@ var feeRateObject={
             if(me.editingCell==null){
                 var showSelectBtn = true;
                 if(hitinfo.sheet.name()!='calc_detail'){
-                    showSelectBtn=me.ifFeeRateEdit();
+                    showSelectBtn=me.ifFeeRateEdit(hitinfo.row);
                 }
                 if(showSelectBtn){
                     me.editingCell={
@@ -358,7 +359,7 @@ var feeRateObject={
                 var imageHeight = hitinfo.cellRect.height-2*imageMagin;
                 var imageWidth = hitinfo.cellRect.width*2/7;
                 if(hitinfo.x<offset&&hitinfo.x>offset-imageWidth){
-                    if(!projectReadOnly){
+                    if(!projectReadOnly && me.ifFeeRateEdit(hitinfo.row)){
                         me.showSelectModal(hitinfo);
                     }
                 }
@@ -405,8 +406,8 @@ var feeRateObject={
         }
         return children.length+sum;
     },
-    ifFeeRateEdit:function () {
-        var selected = projectObj.project.mainTree.selected;
+    ifFeeRateEdit:function (row) {
+        var selected = projectObj.project.mainTree.items[row];
         return selected&&MainTreeCol.readOnly.forFeeRate(selected)?false:true;
     },
     createSpreadView:function () {

+ 31 - 46
web/building_saas/main/js/views/glj_view.js

@@ -100,17 +100,9 @@ var gljOprObj = {
         sheetCommonObj.initSheet(me.sheet, me.setting, 30);
         sheet.name('ration_glj');
         me.bindSheetEvent(sheet);
-        sheet.bind(GC.Spread.Sheets.Events.CellClick, me.onCellClick);
         sheet.bind(GC.Spread.Sheets.Events.CellDoubleClick, me.onCellDoubleClick);
         sheet.bind(GC.Spread.Sheets.Events.ClipboardChanged, me.onClipboardChanged);
         subSpread.bind(GC.Spread.Sheets.Events.ButtonClicked, me.onButtonClick);
-        sheet.bind(GC.Spread.Sheets.Events.EditStarting, function (sender, args) {
-            if (args.row>=me.sheetData.length){
-                args.cancel = true;
-            }else if (me.sheetData[args.row].isMixRatio) {
-                args.cancel = true;
-            }
-        });
         if(!projectReadOnly){
             gljContextMenu.loadGLJSpreadContextMenu();
         }
@@ -125,15 +117,6 @@ var gljOprObj = {
         // me.detailSheet.selectionUnit(0);//0 cell,1 row,2 col;
         sheet.name('quantity_detail');
         me.bindSheetEvent(sheet);
-        sheet.bind(GC.Spread.Sheets.Events.EditStarting, function (sender, args) {
-            if(me.detailSheetReadonly()){
-                args.cancel = true;
-            }else {
-                if(args.sheet.getValue(args.row,args.col)==null){//这里是为了解决当单元格里的值是null的时候,在单元格里输入数据,按键盘箭头移动光标的时候,会直接结束编辑,跳到另外的单元格。
-                    args.sheet.setValue(args.row,args.col,"");
-                }
-            }
-        });
     },
     detailSheetReadonly:function () {
         let selected = projectObj.project.mainTree.selected;
@@ -186,6 +169,19 @@ var gljOprObj = {
         if(selected){
             if(me.isInstallationNode(selected)==true){
                 args.cancel = true;
+            }else {
+                if(args.sheetName == 'quantity_detail'){//工程量明细表
+                    if(me.detailSheetReadonly()){
+                        args.cancel = true;
+                    }else {
+                        if(args.sheet.getValue(args.row,args.col)==null){//这里是为了解决当单元格里的值是null的时候,在单元格里输入数据,按键盘箭头移动光标的时候,会直接结束编辑,跳到另外的单元格。
+                            args.sheet.setValue(args.row,args.col,"");
+                        }
+                    }
+                }
+                if(args.sheetName == 'ration_glj'){//定额工料机表
+                    if(!me.rationGLJEditCheck(args)) args.cancel = true;
+                }
             }
         }else {
             args.cancel = true;
@@ -310,14 +306,6 @@ var gljOprObj = {
             installationFeeObj.onRationInstallValueChange(sender,args);
         }
     },
-    onCellClick: function (sender, args) {
-        console.log('cellClick');
-        var me = gljOprObj;
-        if (args.row >= me.sheetData.length) {
-            return;
-        }
-        me.editChecking(args);
-    },
     onCellDoubleClick:function (sender, args) {
         var me = gljOprObj;
         var header = me.setting.header;
@@ -343,39 +331,32 @@ var gljOprObj = {
         sheetCommonObj.copyTextToClipboard(cDatas);
         return;
     },
-    editChecking: function (args) {
+    rationGLJEditCheck:function (args) {//true 可以编辑,false 不能编辑
         var me = gljOprObj;
         var header = me.setting.header;
-        var disable = null;
-        if (me.sheetData[args.row] != undefined) {
-            if (me.sheetData[args.row].isMixRatio) {
-                disable = true;
+        if (_.includes(me.setting.view.lockColumns, args.col))  return false;//如果是锁定的列,不能编辑
+        if(me.sheetData[args.row] != undefined){
+            if(me.sheetData[args.row].isMixRatio){//对于组成物列
+               return header[args.col].dataCode == 'marketPrice'//允许修改组成物市单价,其它的不可以
             }else {
                 if (header[args.col] && header[args.col].dataCode == 'marketPrice') {
-                    if(me.marketPriceReadOnly({data:me.sheetData[args.row]})){
-                        disable = true;
-                    }else {
-                        disable = false;
-                    }
+                    return !me.marketPriceReadOnly({data:me.sheetData[args.row]});
                 }
                 if (header[args.col] && header[args.col].dataCode == 'basePrice') {
                     var isAdd = me.sheetData[args.row].isAdd;
                     if(isAdd==1){//是新增但没有组成物时允许修改定额价
-                        if(me.marketPriceReadOnly({data:me.sheetData[args.row]})){//如果有组成物,不可修改
-                            disable = true;
-                        }else {
-                            disable = false;
-                        }
+                        return !me.marketPriceReadOnly({data:me.sheetData[args.row]});//如果有组成物,不可修改
                     } else {
-                        disable = true;
+                        return false;
                     }
                 }
+                return true;
             }
+        }else {
+            return false
         }
-        if (disable != null) {
-            me.sheet.getCell(args.row, args.col, GC.Spread.Sheets.SheetArea.viewport).locked(disable);
-        }
-    },
+    }
+    ,
     hasComposition:function (ration_glj,isRationType) {//判断是否有组成物,有则返回true   现在主材类型的工料机也有可能有组成物。
         let type = isRationType==true? ration_glj.subType:ration_glj.type;
         if(notEditType.indexOf(type)!=-1||type==gljType.MAIN_MATERIAL){
@@ -542,7 +523,7 @@ var gljOprObj = {
             this.sheet.setSelection(selected[0].row,selected[0].col,selected[0].rowCount,selected[0].colCount);
         }
     },
-    getUnitPriceCodeMap : function (sheetData) {//取单价文件中,编码前缀一样的映射表
+    getUnitPriceCodeMap : function () {//取单价文件中,编码前缀一样的映射表
         let codeMap = {};
         let priceMap = projectObj.project.projectGLJ.datas.unitPriceMap;
         if(priceMap){
@@ -775,6 +756,10 @@ var gljOprObj = {
         var updateField = me.setting.header[args.col].dataCode;
         var recode = me.sheetData[args.row];
         var newval;
+        if(!me.rationGLJEditCheck(args)){
+            recode? me.sheet.getCell(args.row, args.col).value(recode[updateField]): me.sheet.getCell(args.row, args.col).value(null);
+            return;
+        }
         if (updateField == 'marketPrice' || updateField == 'customQuantity' || updateField == 'basePrice') {
             if (args.editingText == null) {
                 updateField == 'marketPrice' ? newval = 0 : newval = "";

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

@@ -100,7 +100,7 @@ let MainTreeCol = {
             return node.data.subType != 201 && node.data.subType != 4 && node.data.subType != 5
         },
         commonUnitFee: function (node) {
-            return !(calcTools.isLeafBill(node) && !calcTools.isbigBill(node) && !calcTools.isCalcBaseBill(node) && !calcTools.isInheritFrom(node, [fixedFlag.SUB_ENGINERRING, fixedFlag.MEASURE]));
+            return !(calcTools.isLeafBill(node) && !calcTools.isBill_DXFY(node) && !calcTools.isCalcBaseBill(node) && !calcTools.isInheritFrom(node, [fixedFlag.SUB_ENGINERRING, fixedFlag.MEASURE]));
         },
         //根据节点、父节点类型判断是否可用计算基数
         calcBaseType: function (node) {
@@ -394,7 +394,7 @@ let colSettingObj = {
         sheet.getRange(-1, 0, -1, 1).cellType(this.checkBox).hAlign(GC.Spread.Sheets.HorizontalAlign.center);
         sheet.getCell(0, 0, GC.Spread.Sheets.SheetArea.colHeader).value('显示');
         sheet.setColumnWidth(0, 100);
-        sheet.setColumnWidth(0, 150, GC.Spread.Sheets.SheetArea.rowHeader);
+        sheet.setColumnWidth(0, 240, GC.Spread.Sheets.SheetArea.rowHeader);
 
         setting.cols.forEach(function (col, index) {
             let i, iCol = 0, cell;

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

@@ -8,7 +8,7 @@ let basicInfoView = {
     setting:{
         header: [
             {name: '属性', dataCode: 'dispName', width: 200, vAlign: 'center', hAlign: 'left'},
-            {name: '值', dataCode: 'value', width: 120, vAlign: 'center', hAlign: 'center'}
+            {name: '值', dataCode: 'value', width: 300, vAlign: 'center', hAlign: 'left'}
         ],
         options: {
             allowContextMenu: false,

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

@@ -9,7 +9,7 @@ let projFeatureView = {
     setting:{
         header: [
             {name: '属性', dataCode: 'dispName', width: 200, vAlign: 'center', hAlign: 'left'},
-            {name: '值', dataCode: 'value', width: 120, vAlign: 'center', hAlign: 'center'}
+            {name: '值', dataCode: 'value', width: 300, vAlign: 'center', hAlign: 'left'}
         ],
         options: {
             allowContextMenu: false,

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

@@ -551,16 +551,16 @@ var projectObj = {
 
     },
     showBillOrRationLib(node){
+        let BILLS = projectObj.project.Bills;
         if(node.sourceType == ModuleNames.bills){//当清单是“分部分项工程”、“措施项目工程”时,要展开清单规则节点
-
+            if(BILLS.isFXorBX(node)||(node.data.type == billType.BILL && BILLS.isMeasure(node))){//是分项或补项,是清单并且属于措施项目节点
+                if(!$("#qd").is(":visible"))  $('#stdBillsTab').click();
+            }
+        }
+        if(node.sourceType == ModuleNames.ration){ //在定额编码中双击,如果右侧定额库没有展开,则自动展开。
+            if(!$("#de").is(":visible"))  $('#stdRationTab').click();
         }
 
-
-
-/*
-        if(node){
-            if(!$("#qd").is(":visible"))  $('#stdBillsTab').click();
-        }*/
     },
     onColumnWidthChanged: function (sender, info) {         // CSL,2018.07.25
         if (info.colList.includes(4) || info.colList.includes(5)){
@@ -580,6 +580,127 @@ var projectObj = {
             }
         }
     },
+    onClipboardPasting: function (sender, info){
+        info.cancel = true;
+
+        let rIdx = info.sheet.getActiveRowIndex();
+        let node = projectObj.project.mainTree.items[rIdx];
+        if (!node.parent){
+            hintBox.infoBox('系统提示','大项费用不允许粘贴!', 1);
+            return false;
+        };
+
+        let colName = projectObj.project.projSetting.main_tree_col.cols[info.cellRange.col].data.field;
+        if (colName == 'code'){
+            function getNodeType(node) {
+                let t = null;
+                if (calcTools.isRationItem(node))
+                    t = 1
+                else if (calcTools.isBill(node)){
+                    if (calcTools.isBill_FB(node))
+                        t = 2
+                    else if (calcTools.isBill_FX(node) || calcTools.isBill_BX(node))
+                        t = 3
+                    else if (calcTools.isBill_BILL(node))
+                        t = 4;
+                };
+                return t;
+            };
+            function getPasteTextArr(info) {
+                let copyText = info.pasteData.text.trim();
+                if (!copyText) return null;
+                let rows = copyText.split('\r\n');
+                let rstArr = [];
+                for (let row of rows) {
+                    row = row.trim();
+                    row = row.split('\t');
+                    rstArr.push(row);
+                }
+                return rstArr;
+            };
+            function getPasteNodes(count, nodeType) {
+                let nodesArr = [];
+                let curNode = null;
+                for (let i = rIdx; i < rIdx + count; i++) {
+                    curNode = projectObj.project.mainTree.items[i];
+                    if (curNode && calcTools.isSameTypeNode(curNode, node)){
+                        nodesArr.push(curNode);
+                    }
+                    else{
+                        curNode = projectObj.project.mainTree.items[i - 1];
+                        break;
+                    }
+                };
+
+                if (nodesArr.length < count){
+                    if (projectObj.project.mainTree.selected != curNode)
+                        projectObj.project.mainTree.selected = curNode;
+
+                    let add = count - nodesArr.length;
+                    for (let i = 0; i < add; i++) {
+                        switch (nodeType) {
+                            case 1:
+                                curNode = projectObj.project.Ration.addNewRation(null,rationType.ration,null,true);
+                                break;
+                            case 2:
+                                curNode = ProjectController.addFB(projectObj.project, projectObj.mainController);
+                                break;
+                            case 3:
+                                curNode = ProjectController.addFX(projectObj.project, projectObj.mainController);
+                                break;
+                            case 4:
+                                curNode = ProjectController.addBills(projectObj.project, projectObj.mainController);
+                                break;
+                        }
+
+                        if (!curNode){
+                            hintBox.infoBox('系统提示','插入新结点出错,粘贴失败!', 1);
+                            return nodesArr;
+                        }
+                        else{
+                            nodesArr.push(curNode);
+                            if (projectObj.project.mainTree.selected != curNode)
+                                projectObj.project.mainTree.selected = curNode;
+                        }
+                    }
+                };
+
+                return nodesArr;
+            };
+            function doPaste(datas, nodes, nodeType) {
+                if (nodeType == 1){  // 批量粘贴定额有严重的异步问题,这里要和清单分开处理
+                    let updateRationCodes = [];
+                    for (let i = 0; i < datas.length; i++) {
+                        let ptNode = nodes[i];
+                        let code = datas[i][0];
+                        updateRationCodes.push({'node':ptNode, value:code});
+                    }
+                    projectObj.project.Ration.updateRationCodes(updateRationCodes);
+                }
+                else {
+                    for (let i = 0; i < datas.length; i++) {
+                        let ptNode = nodes[i];
+                        let code = datas[i][0];
+                        if (!(ptNode.data && ptNode.data.code && ptNode.data.code.sameText(code))){
+                            projectObj.updateCode(ptNode, code);
+                        };
+                    }
+                }
+                projectObj.mainController.refreshTreeNode(nodes);
+            };
+
+            let tagType = getNodeType(node);
+            if (!tagType){
+                hintBox.infoBox('系统提示', '该树结点类型不支持从项目编码列粘贴!', 1);
+                return false;
+            };
+
+            let datas = getPasteTextArr(info);
+            if (!datas) return;
+            let pasteNodes = getPasteNodes(datas.length, tagType);
+            doPaste(datas, pasteNodes, tagType);
+        };
+    },
     mainSpreadEditEnded: function (sender, info) {
         console.log('enterEDEnd');
         let project = projectObj.project;
@@ -745,6 +866,8 @@ var projectObj = {
                 that.mainSpread.bind(GC.Spread.Sheets.Events.ButtonClicked, that.onButtonClick);
                 that.mainSpread.bind(GC.Spread.Sheets.Events.CellDoubleClick, that.onCellDoubleClick);
                 that.mainSpread.bind(GC.Spread.Sheets.Events.ColumnWidthChanged, that.onColumnWidthChanged);
+                that.mainSpread.bind(GC.Spread.Sheets.Events.ClipboardPasting, that.onClipboardPasting);
+
                 //let loadOtherStartTime = +new Date();
                 if(!projectReadOnly){
                     that.loadMainSpreadContextMenu();
@@ -765,8 +888,6 @@ var projectObj = {
                 if(projectReadOnly){
                     disableSpread(that.mainSpread);
                 }
-                let themeName = that.mainSpread.getSheet(0).currentTheme().name();
-                console.log(GC.Spread.Sheets.Themes[themeName]);
                 $.bootstrapLoading.end();
             }
             else {
@@ -1268,6 +1389,7 @@ var projectObj = {
         const sheet = this.mainSpread.getActiveSheet();
         sheet.setSelection(row, col, 1, 1);
         this.mainController.setTreeSelected(this.mainController.tree.items[row]);//触发树节点选中事件
+        sheet.showRow(row, GC.Spread.Sheets.VerticalPosition.center);
     },
     // 选中区域合计数字
     amountAreaNumber: function(e, info) {

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

@@ -469,6 +469,7 @@ const billsGuidance = (function () {
     //@param {Number}libID @return {void}
     function libInitSel(libID){
         //获取清单
+        $.bootstrapLoading.start();
         CommonAjax.post('/billsGuidance/api/getLibWithBills', {libID: libID}, function(rstData){
             //获取清单库中的工作内容和项目特征
             initJobAndCharacter(rstData.guidanceLib.billsLibId);
@@ -480,6 +481,9 @@ const billsGuidance = (function () {
             setTagForHint(bills.tree.items);
             //默认初始节点
             billsInitSel(0);
+            $.bootstrapLoading.end();
+        }, function () {
+            $.bootstrapLoading.end();
         });
     }
     //初始化清单指引库

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

@@ -200,7 +200,7 @@ var billsLibObj = {
                 showBillsRemark(node);
             }
         };
-
+        $.bootstrapLoading.start();
         CommonAjax.post('/stdBillsEditor/getJobContent', {userId: userID, billsLibId: stdBillsLibID}, function (datas) {
             stdBillsJobData = datas;
         }, function () {
@@ -253,8 +253,10 @@ var billsLibObj = {
                     args.sheet.repaint();
                 }
             });
+            $.bootstrapLoading.end();
         }, function () {
             that.stdBillsSpread.unbind(GC.Spread.Sheets.Events.CellDoubleClick);
+            $.bootstrapLoading.end();
         });
 
         $('#stdBillsSearch>span>button').click(function () {

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

@@ -53,6 +53,7 @@ var rationLibObj = {
         }
     },
     loadStdRation: function (rationLibID) {
+        $.bootstrapLoading.start();
         var that = this;
         var showRationChapterTree = function (datas) {
             var rationChapterTree = idTree.createNew({id: 'ID', pid: 'ParentID', nid: 'NextSiblingID', rootId: -1, autoUpdate: false});
@@ -86,8 +87,10 @@ var rationLibObj = {
 
         CommonAjax.post('/complementaryRation/api/getRationTree', {userId: userID, rationRepId: rationLibID}, function (datas) {
             showRationChapterTree(datas);
+            $.bootstrapLoading.end();
         }, function () {
             showRationChapterTree([]);
+            $.bootstrapLoading.end();
         });
     },
     //双击隐藏显示

+ 1 - 1
web/building_saas/pm/html/project-management.html

@@ -49,7 +49,7 @@
     <%include ../../../common/html/header.html %>
 </div>
     <div class="main">
-        <div class="poj-manage container-fluid">
+        <div class="poj-manage container-fluid p-0">
             <div class="pm-side">
                 <div class="poj-cate">
                     <div class="dropdown">

+ 1 - 0
web/building_saas/pm/js/pm_newMain.js

@@ -1626,6 +1626,7 @@ function init() {
             projTreeObj.tree = pmTree.createNew(projTreeObj.setting, datas);
             projTreeObj.tree.selected = projTreeObj.tree.items[0];
             projTreeObj.workBook = projTreeObj.buildSheet(projTreeObj.workBook,'projSpread',projTreeObj.setting);
+            projTreeObj.workBook.getSheet(0).frozenColumnCount(2);
             sheetCommonObj.spreadDefaultStyle(projTreeObj.workBook);
             projTreeObj.sumEngineeringCost();
             projTreeObj.showTreeData(projTreeObj.tree.items, projTreeObj.setting.header, projTreeObj.workBook.getActiveSheet());