|  | @@ -307,6 +307,8 @@ var gljOprObj = {
 | 
	
		
			
				|  |  |              var index= _.indexOf(me.setting.notEditedType,type);
 | 
	
		
			
				|  |  |              if(index!=-1){
 | 
	
		
			
				|  |  |                  me.sheet.getCell(args.row, args.col, GC.Spread.Sheets.SheetArea.viewport).locked(true);
 | 
	
		
			
				|  |  | +            }else {
 | 
	
		
			
				|  |  | +                me.sheet.getCell(args.row, args.col, GC.Spread.Sheets.SheetArea.viewport).locked(false);
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      },
 | 
	
	
		
			
				|  | @@ -487,7 +489,6 @@ var gljOprObj = {
 | 
	
		
			
				|  |  |          return rowstr;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |      showDataIfRationSelect:function (node) {
 | 
	
		
			
				|  |  |          var isShow = false;
 | 
	
		
			
				|  |  |          if(node){
 | 
	
	
		
			
				|  | @@ -526,9 +527,24 @@ var gljOprObj = {
 | 
	
		
			
				|  |  |              this.showInSheet(gljList);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  | -    showRationGLJSheetData:function () {
 | 
	
		
			
				|  |  | -        this.sheetData=_.sortBy(this.sheetData,'type');
 | 
	
		
			
				|  |  | +    showRationGLJSheetData:function (init) {
 | 
	
		
			
				|  |  | +        if(init){
 | 
	
		
			
				|  |  | +            this.sheetData=_.sortBy(this.sheetData,'type');
 | 
	
		
			
				|  |  | +            this.addMixRatioToShow();
 | 
	
		
			
				|  |  | +            this.initRationTree();
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |          sheetCommonObj.showData(this.sheet,this.setting,this.sheetData);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    initRationTree:function () {
 | 
	
		
			
				|  |  | +        this.sheet.getRange(-1, 0, -1, 1).cellType(this.getTreeNodeCellType(this.sheetData));
 | 
	
		
			
				|  |  | +        for(var i =0;i<this.sheetData.length;i++){
 | 
	
		
			
				|  |  | +            if(this.sheetData[i].hasOwnProperty('subList')){
 | 
	
		
			
				|  |  | +                this.sheet.setTag(i,0,true);
 | 
	
		
			
				|  |  | +                this.sheet.getRange(i+1, -1, this.sheetData[i].subList.length, -1).visible(false);
 | 
	
		
			
				|  |  | +                this.sheet.getRange(i+1, -1, this.sheetData[i].subList.length, -1).locked(true);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  |      filterGljByRation:function (ration,datas) {
 | 
	
		
			
				|  |  |          var gljList=[];
 | 
	
	
		
			
				|  | @@ -539,24 +555,62 @@ var gljOprObj = {
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  |      showInSheet:function(gljList){
 | 
	
		
			
				|  |  |          this.sheetData=this.combineWithProjectGlj(gljList);
 | 
	
		
			
				|  |  | -        this.showRationGLJSheetData();
 | 
	
		
			
				|  |  | +        this.showRationGLJSheetData(true);
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    addMixRatioToShow:function () {
 | 
	
		
			
				|  |  | +        var newList=[];
 | 
	
		
			
				|  |  | +      for(var i =0;i<this.sheetData.length;i++){
 | 
	
		
			
				|  |  | +          newList.push(this.sheetData[i]);
 | 
	
		
			
				|  |  | +          if(this.sheetData[i].hasOwnProperty('subList')){
 | 
	
		
			
				|  |  | +                newList = newList.concat(this.sheetData[i].subList);
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +        this.sheetData= newList;
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  |      combineWithProjectGlj:function (ration_gljs) {
 | 
	
		
			
				|  |  | -        var projectGljs = projectObj.project.projectGLJ.datas.gljList;
 | 
	
		
			
				|  |  | +        var projectGLJData = projectObj.project.projectGLJ.datas;
 | 
	
		
			
				|  |  | +        var projectGljs = projectGLJData.gljList;
 | 
	
		
			
				|  |  | +        var mixRatioMap = projectGLJData.mixRatioMap;
 | 
	
		
			
				|  |  |          if(ration_gljs&&ration_gljs.length>0&&projectGljs&&projectGljs.length>0){
 | 
	
		
			
				|  |  | -            ration_gljs.forEach(function (a) {
 | 
	
		
			
				|  |  | -                var glj = _.find(projectGljs,{id:a.projectGLJID});
 | 
	
		
			
				|  |  | +            for(var i =0;i<ration_gljs.length;i++){
 | 
	
		
			
				|  |  | +                var glj = _.find(projectGljs,{'id':ration_gljs[i].projectGLJID});
 | 
	
		
			
				|  |  |                  if(glj){
 | 
	
		
			
				|  |  | -                    a.basePrice=glj.unit_price.base_price;
 | 
	
		
			
				|  |  | -                    a.marketPrice=glj.unit_price.market_price;
 | 
	
		
			
				|  |  | -                    a.adjustPrice=glj.adjust_price;
 | 
	
		
			
				|  |  | -                    a.isEstimate=glj.is_evaluate;
 | 
	
		
			
				|  |  | +                    ration_gljs[i].basePrice=glj.unit_price.base_price;
 | 
	
		
			
				|  |  | +                    ration_gljs[i].marketPrice=glj.unit_price.market_price;
 | 
	
		
			
				|  |  | +                    ration_gljs[i].adjustPrice=glj.adjust_price;
 | 
	
		
			
				|  |  | +                    ration_gljs[i].isEstimate=glj.is_evaluate;
 | 
	
		
			
				|  |  | +                    if(mixRatioMap.hasOwnProperty(glj.code)){
 | 
	
		
			
				|  |  | +                        var mixRatios = this.getMixRationShowDatas(mixRatioMap[glj.code],projectGljs);
 | 
	
		
			
				|  |  | +                        ration_gljs[i].subList = mixRatios;
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  | -            })
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          return ration_gljs;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    ,
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    getMixRationShowDatas:function (mixRatioList,projectGljs) {
 | 
	
		
			
				|  |  | +        var temRationGLJs = [];
 | 
	
		
			
				|  |  | +        for(var i =0;i<mixRatioList.length;i++){
 | 
	
		
			
				|  |  | +            var pg =  _.find(projectGljs,{'code':mixRatioList[i].code});
 | 
	
		
			
				|  |  | +            var tem = {
 | 
	
		
			
				|  |  | +                code:pg.code,
 | 
	
		
			
				|  |  | +                name:pg.name,
 | 
	
		
			
				|  |  | +                specs:pg.specs,
 | 
	
		
			
				|  |  | +                unit:pg.unit,
 | 
	
		
			
				|  |  | +                shortName:pg.unit_price.short_name,
 | 
	
		
			
				|  |  | +                rationItemQuantity:mixRatioList[i].consumption,
 | 
	
		
			
				|  |  | +               // quantity:mixRatioList[i].consumption,
 | 
	
		
			
				|  |  | +                basePrice:pg.unit_price.base_price,
 | 
	
		
			
				|  |  | +                marketPrice:pg.unit_price.market_price,
 | 
	
		
			
				|  |  | +                adjustPrice:pg.adjust_price,
 | 
	
		
			
				|  |  | +                isEstimate:pg.is_evaluate,
 | 
	
		
			
				|  |  | +                isMixRatio:true
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            temRationGLJs.push(tem);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        temRationGLJs=_.sortBy(temRationGLJs,'code');
 | 
	
		
			
				|  |  | +        return temRationGLJs;
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  |      showRationCoeData:function (node) {
 | 
	
		
			
				|  |  |          var coeList = [];
 | 
	
		
			
				|  |  |          var ration_coe= projectObj.project.ration_coe;
 | 
	
	
		
			
				|  | @@ -874,6 +928,111 @@ var gljOprObj = {
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  |      refreshView:function () {
 | 
	
		
			
				|  |  |          this.showRationGLJData();
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    getTreeNodeCellType:function (data) {
 | 
	
		
			
				|  |  | +        var ns = GC.Spread.Sheets;
 | 
	
		
			
				|  |  | +        var rectW = 10;
 | 
	
		
			
				|  |  | +        var rectH = 10;
 | 
	
		
			
				|  |  | +        var margin = 3;
 | 
	
		
			
				|  |  | +        function TreeNodeCellType() {
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        function drowRect(ctx,x,y,w,h) {
 | 
	
		
			
				|  |  | +            ctx.save();
 | 
	
		
			
				|  |  | +            ctx.strokeStyle = "gray";
 | 
	
		
			
				|  |  | +            ctx.translate(0.5,0.5);
 | 
	
		
			
				|  |  | +            ctx.beginPath();
 | 
	
		
			
				|  |  | +            var rectX = x+margin;
 | 
	
		
			
				|  |  | +            var rectY =  y+ Math.round(h/2)-rectH/2;
 | 
	
		
			
				|  |  | +            ctx.moveTo(rectX, rectY);
 | 
	
		
			
				|  |  | +            ctx.lineTo(rectX, rectY+rectH);
 | 
	
		
			
				|  |  | +            ctx.lineTo(rectX+rectW, rectY+rectH);
 | 
	
		
			
				|  |  | +            ctx.lineTo(rectX+rectW, rectY);
 | 
	
		
			
				|  |  | +            ctx.lineTo(rectX, rectY);
 | 
	
		
			
				|  |  | +            ctx.moveTo(rectX+rectW, y+Math.round(h/2));
 | 
	
		
			
				|  |  | +            ctx.lineTo(rectX+rectW+5, y+Math.round(h/2));
 | 
	
		
			
				|  |  | +            ctx.stroke();
 | 
	
		
			
				|  |  | +            ctx.restore();
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        function drowSymbol(ctx,x,y,w,h,collapsed) {
 | 
	
		
			
				|  |  | +            ctx.save();
 | 
	
		
			
				|  |  | +            ctx.strokeStyle = "#000000";
 | 
	
		
			
				|  |  | +            ctx.translate(0.5, 0.5);
 | 
	
		
			
				|  |  | +            ctx.beginPath();
 | 
	
		
			
				|  |  | +            ctx.moveTo(x+margin+2, y+Math.round(h/2));
 | 
	
		
			
				|  |  | +            ctx.lineTo(x+margin+8, y+Math.round(h/2));
 | 
	
		
			
				|  |  | +            var rectY =  y+ Math.round(h/2)-rectH/2;
 | 
	
		
			
				|  |  | +            if(collapsed){
 | 
	
		
			
				|  |  | +                ctx.moveTo(x+margin+rectW/2,rectY+2);
 | 
	
		
			
				|  |  | +                ctx.lineTo(x+margin+rectW/2,rectY+2+6);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            ctx.stroke();
 | 
	
		
			
				|  |  | +            ctx.restore();
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        function drowSubItem(ctx,x,y,w,h,offset,nextItem) {
 | 
	
		
			
				|  |  | +            offset+=6;
 | 
	
		
			
				|  |  | +            ctx.save();
 | 
	
		
			
				|  |  | +            ctx.strokeStyle = "gray";
 | 
	
		
			
				|  |  | +            ctx.translate(0.5, 0.5);
 | 
	
		
			
				|  |  | +            ctx.beginPath();
 | 
	
		
			
				|  |  | +            ctx.moveTo(x+offset, y);
 | 
	
		
			
				|  |  | +            ctx.lineTo(x+offset, y+Math.round(h/2));
 | 
	
		
			
				|  |  | +            offset+=9;
 | 
	
		
			
				|  |  | +            ctx.lineTo(x+offset, y+Math.round(h/2));
 | 
	
		
			
				|  |  | +            if(nextItem&&nextItem.isMixRatio){
 | 
	
		
			
				|  |  | +                ctx.moveTo(x+offset-9, y+Math.round(h/2));
 | 
	
		
			
				|  |  | +                ctx.lineTo(x+offset-9, y+h);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            ctx.stroke();
 | 
	
		
			
				|  |  | +            ctx.restore();
 | 
	
		
			
				|  |  | +            return offset;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        TreeNodeCellType.prototype = new ns.CellTypes.Text();
 | 
	
		
			
				|  |  | +        TreeNodeCellType.prototype.paint = function (ctx, value, x, y, w, h, style, options) {
 | 
	
		
			
				|  |  | +            if(value!=null){
 | 
	
		
			
				|  |  | +                var offset = margin+rectW+6;
 | 
	
		
			
				|  |  | +                var recode = data[options.row];
 | 
	
		
			
				|  |  | +                if(recode&&recode.hasOwnProperty('subList')){
 | 
	
		
			
				|  |  | +                    drowRect(ctx,x,y,w,h);
 | 
	
		
			
				|  |  | +                    var collapsed = options.sheet.getTag(options.row,options.col);
 | 
	
		
			
				|  |  | +                    drowSymbol(ctx,x,y,w,h,collapsed);
 | 
	
		
			
				|  |  | +                }else if(recode.isMixRatio){
 | 
	
		
			
				|  |  | +                    offset= drowSubItem(ctx,x,y,w,h,offset,data[options.row+1]);
 | 
	
		
			
				|  |  | +                    offset+=1;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                ctx.fillText(value,x+offset+ctx.measureText(value).width,y+h-5);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        };
 | 
	
		
			
				|  |  | +        // override getHitInfo to allow cell type get mouse messages
 | 
	
		
			
				|  |  | +        TreeNodeCellType.prototype.getHitInfo = function (x, y, cellStyle, cellRect, context) {
 | 
	
		
			
				|  |  | +            return {
 | 
	
		
			
				|  |  | +                x: x,
 | 
	
		
			
				|  |  | +                y: y,
 | 
	
		
			
				|  |  | +                row: context.row,
 | 
	
		
			
				|  |  | +                col: context.col,
 | 
	
		
			
				|  |  | +                cellStyle: cellStyle,
 | 
	
		
			
				|  |  | +                cellRect: cellRect,
 | 
	
		
			
				|  |  | +                sheetArea: context.sheetArea
 | 
	
		
			
				|  |  | +            };
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        TreeNodeCellType.prototype.processMouseDown = function (hitinfo) {
 | 
	
		
			
				|  |  | +            var recode = data[hitinfo.row];
 | 
	
		
			
				|  |  | +            if(recode&&recode.hasOwnProperty('subList')){
 | 
	
		
			
				|  |  | +               var hoffset= hitinfo.cellRect.x+3;
 | 
	
		
			
				|  |  | +                if (hitinfo.x > hoffset && hitinfo.x < hoffset + 10){
 | 
	
		
			
				|  |  | +                    var collapsed =  hitinfo.sheet.getTag(hitinfo.row,hitinfo.col,hitinfo.sheetArea);
 | 
	
		
			
				|  |  | +                    collapsed = !collapsed;
 | 
	
		
			
				|  |  | +                    hitinfo.sheet.setTag(hitinfo.row,hitinfo.col,collapsed);
 | 
	
		
			
				|  |  | +                    hitinfo.sheet.getRange(hitinfo.row+1, -1, recode.subList.length, -1).visible(!collapsed);
 | 
	
		
			
				|  |  | +                    hitinfo.sheet.invalidateLayout();
 | 
	
		
			
				|  |  | +                    hitinfo.sheet.repaint();
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        };
 | 
	
		
			
				|  |  | +        return new TreeNodeCellType()
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 |