/** * Created by chen on 2017/8/1. */ var feeRateObject={ mainFeeRateSpread:null, mainFeeRateSheet:null, mainFeeRateData:null, mainFeeRateSetting:{ header: [ {headerName: "专业名称", headerWidth: 550, dataCode: "name", dataType: "String"}, {headerName: "值%", headerWidth: 250, dataCode: "rate", dataType: "Number",hAlign: "right",decimalField:"feeRate"}, {headerName: "备注", dataCode: "memo", dataType: "String"} ], view: { lockColumns: [0] } }, mainViews:null, datas:null, datasBackup:null, canEdit:false, activateFeeRate:null, needCascadeSet:false, selectionLoad:false, changeInfo:null, feeRateSpreads:null, editingCell:null, feeRateSelection:null, sheetSetting: { header: [ {headerName: "专业名称", headerWidth: 200, dataCode: "name", dataType: "String"}, {headerName: "值%", headerWidth: 120, dataCode: "rate", dataType: "Number",hAlign: "right",decimalField:"feeRate"}, {headerName: "备注", dataCode: "memo", dataType: "String"} ], view: { comboBox: [], lockColumns: [0, 1, 2] } }, columns: [ { id: 'name', caption: '专业名称', dataField: 'name', width: 450, allowEditing: false }, { id: 'rate', caption: '值%', dataField: 'rate', width: 120, minWidth: 50, allowEditing: true }, { id: 'memo', caption: '备注', dataField: 'memo', minWidth: 120, allowEditing: true }, { id: 'ID', caption: 'ID', dataField: 'ID', width: 80, visible: false, allowEditing: false }, { id: 'subFeeRate', caption: '子费率', dataField: 'subFeeRate', width: 80, visible: false, allowEditing: false }, { id: '_id', caption: '自动ID', dataField: '_id', width: 80, visible: false, allowEditing: false }, { id: 'ParentID', caption: '父结点ID', dataField: 'ParentID', width: 80, visible: false, allowEditing: false } ], options :{ allowSorting: false, showRowHeader: true, colMinWidth: 80, rowHeight: 30, allowEditing: true, editMode: 'inline', editUnit: 'cell', selectionUnit: "row", hierarchy: { keyField: 'ID', parentField: 'ParentID', collapsed: false, column: 'name' } }, dataSource : { loadRange: function(params) { params.success(feeRateObject.datas); }, update: function(params) { if(!params.hasOwnProperty('sourceIndex')){ var selected = feeRateObject.mainViews.getSelections()[0]; params.sourceIndex = selected.sourceRow; } params.success(); if(!$('#cascadeSet').prop('checked')||params.hasOwnProperty('viewIndex')){ projectObj.project.FeeRate.updateFeeRateByEdit(params,feeRateObject.activateFeeRate); } } }, createSheet:function(){ var feeRateFile = projectObj.project.FeeRate.getActivateFeeRate(); feeRateObject.feeRateSpreads=sheetCommonObj.buildSheet($('#fee_rate_sheet')[0], feeRateObject.sheetSetting,feeRateFile.rates.length); feeRateObject.feeRateSheet = feeRateObject.feeRateSpreads.getSheet(0); feeRateObject.feeRateSheet.selectionUnit(1)//0 cell,1 row,2 col; feeRateObject.feeRateSheet.options.isProtected = true; feeRateObject.feeRateSheet.name('fee_rate'); feeRateObject.feeRateSheet.bind(GC.Spread.Sheets.Events.CellClick,feeRateObject.onCellClick); feeRateObject.feeRateSheet.bind(GC.Spread.Sheets.Events.CellDoubleClick,feeRateObject.onCellDoubleClick); }, showSelectTree:function (sheet,setting,data) { var ch = GC.Spread.Sheets.SheetArea.viewport; var groups=[]; sheet.suspendPaint(); sheet.suspendEvent(); sheet.rowOutlines.direction(GC.Spread.Sheets.Outlines.OutlineDirection.backward); sheet.getRange(-1, 0, -1, 1).cellType(feeRateObject.getTreeNodeCellType()); for (var col = 0; col < setting.header.length; col++) { var hAlign = "left", vAlign = "center"; if (setting.header[col].hAlign) { hAlign = setting.header[col].hAlign; } else if (setting.header[col].dataType !== "String"){ hAlign = "right"; } vAlign = setting.header[col].vAlign?setting.header[col].vAlign:vAlign; sheetCommonObj.setAreaAlign(sheet.getRange(-1, col, -1, 1), hAlign, vAlign); if (setting.header[col].formatter) { sheet.setFormatter(-1, col, setting.header[col].formatter, GC.Spread.Sheets.SheetArea.viewport); } for (var row = 0; row < data.length; row++) { var val = data[row][setting.header[col].dataCode]; if(val&&setting.header[col].dataType === "Number"){ if(setting.header[col].hasOwnProperty('decimalField')){ var decimal = getDecimal(setting.header[col].decimalField); val =scMathUtil.roundToString(val,decimal); sheet.setFormatter(-1, col,getFormatter(decimal), GC.Spread.Sheets.SheetArea.viewport); }else { val =scMathUtil.roundToString(val,2); } } sheet.setValue(row, col, val, ch); if(col==0){ feeRateObject.setSheetGroup(data[row],data,groups,row+1); } } } //this.lockCells(sheet,setting); _.forEach(groups,function (g) { for(var k in g){ sheet.rowOutlines.group(parseInt(k), g[k]); } }) /* sheet.rowOutlines.group(1, 6); sheet.rowOutlines.group(8, 6); sheet.rowOutlines.group(15, 6); sheet.rowOutlines.group(22, 6);*/ // sheet.getRange(-1, 0, -1, 1).width(300); sheet.showRowOutline(false); sheet.resumeEvent(); sheet.resumePaint(false); }, getTreeNodeCellType:function () { var ns = GC.Spread.Sheets; function TreeNodeCellType() { } TreeNodeCellType.prototype = new ns.CellTypes.Text(); TreeNodeCellType.prototype.paint = function (ctx, value, x, y, w, h, style, options) { var level = options.sheet.rowOutlines.getLevel(options.row); var nlevel = -1; if (options.row < options.sheet.getRowCount() - 1) { nlevel = options.sheet.rowOutlines.getLevel(options.row + 1); } var hoffset = (level + 2) * 12; x += hoffset; w -= hoffset; GC.Spread.Sheets.CellTypes.Base.prototype.paint.apply(this, arguments); if (options.row == options.sheet.getRowCount() - 1) return; //last row if (nlevel > level) { var collapsed = options.sheet.rowOutlines.isCollapsed(options.row + 1); x--; y += h / 2 - 3; ctx.save(); ctx.fillStyle = "black"; ctx.beginPath(); if (collapsed) { ctx.moveTo(x - 5, y); ctx.lineTo(x, y + 3); ctx.lineTo(x - 5, y + 6); } else { ctx.moveTo(x, y); ctx.lineTo(x, y + 5); ctx.lineTo(x - 5, y + 5); } ctx.fill(); ctx.restore(); } else { // x--; //y += h / 2 - 3; ctx.save(); ctx.restore(); } }; // 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 level = hitinfo.sheet.rowOutlines.getLevel(hitinfo.row); var hoffset = (level + 2) * 12 + hitinfo.cellRect.x; if (level==-1&&hitinfo.x < hoffset && hitinfo.x > hoffset - 10) { var collapsed = hitinfo.sheet.rowOutlines.isCollapsed(hitinfo.row + 1); hitinfo.sheet.rowOutlines.setCollapsed(hitinfo.row, !collapsed); hitinfo.sheet.invalidateLayout(); hitinfo.sheet.repaint(); } }; return new TreeNodeCellType() }, getFeeRateEditCellType:function () { var ns = GC.Spread.Sheets; function FeeRateEditCellType() { var init=false; } FeeRateEditCellType.prototype = new ns.CellTypes.Text(); FeeRateEditCellType.prototype.paint = function (ctx, value, x, y, w, h, style, options) { // if(value!=null){ // ctx.fillText(value,x+3+ctx.measureText(value).width,y+h-3); GC.Spread.Sheets.CellTypes.Text.prototype.paint.apply(this, arguments); // } if(feeRateObject.editingCell){ if(feeRateObject.editingCell.row==options.row&&feeRateObject.editingCell.col==options.col){ var image = document.getElementById('f_btn'),imageMagin = 3; var imageHeight = h-2*imageMagin; var imageWidth = w*2/7; var imageX = x + w - imageWidth- imageMagin, imageY = y + h / 2 - imageHeight / 2; ctx.save(); ctx.drawImage(image, imageX, imageY,imageWidth,imageHeight); ctx.beginPath(); ctx.arc(imageX+imageWidth/2,imageY+imageHeight/2,1,0,360,false); ctx.arc(imageX+imageWidth/2-4,imageY+imageHeight/2,1,0,360,false); ctx.arc(imageX+imageWidth/2+4,imageY+imageHeight/2,1,0,360,false); ctx.fillStyle="black";//填充颜色,默认是黑色 ctx.fill();//画实心圆 ctx.closePath(); ctx.restore(); } } }; FeeRateEditCellType.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 }; }; FeeRateEditCellType.prototype.processMouseDown = function (hitinfo) { var me=feeRateObject; me.pmLeave = false; if(me.editingCell==null){ var showSelectBtn = true; if(hitinfo.sheet.name()!='calc_detail'){ showSelectBtn=me.ifFeeRateEdit(); } if(showSelectBtn){ me.editingCell={ row:hitinfo.row, col:hitinfo.col } hitinfo.sheet.invalidateLayout(); hitinfo.sheet.repaint(); } }else if(hitinfo.row==me.editingCell.row){ var offset=hitinfo.cellRect.x+hitinfo.cellRect.width-6; var imageMagin=3; var imageHeight = hitinfo.cellRect.height-2*imageMagin; var imageWidth = hitinfo.cellRect.width*2/7; if(hitinfo.xoffset-imageWidth){ me.showSelectModal(hitinfo); } } }; FeeRateEditCellType.prototype.processMouseLeave = function (hitinfo) { if(!feeRateObject.pmLeave){ feeRateObject.editingCell=null; hitinfo.sheet.invalidateLayout(); hitinfo.sheet.repaint(); feeRateObject.pmLeave = true; } } return new FeeRateEditCellType(); }, showSelectModal:function (hitinfo) { $("#fee_rate_tree").modal({show:true}); $('#edit_from').val(hitinfo.sheet.name()); }, setSheetGroup:function (rate,data,groups,row) { var me=this; var group={}; var count=me.getChildrenCount(rate.ID,data); if(count>0){ group[row]=count; groups.push(group); } return groups; }, getChildrenCount:function (id,data) { var me=this; var sum=0; var children=_.filter(data,{'ParentID':id}); if(children&&children.length==0){ return 0; } for(var i=0;i0){//有子节点时不能编辑费率列 args.cancel = true; } }); this.mainFeeRateSheet.name('mainFeeRateSheet'); }, showMainFeeRateData:function () { let me = this; me.activateFeeRate = projectObj.project.FeeRate.getActivateFeeRate(); me.mainFeeRateData = projectObj.project.FeeRate.getActivateFeeRate().rates; me.mainFeeRateSheet.setRowCount(0); me.mainFeeRateSheet.setRowCount(me.mainFeeRateData.length); me.showSelectTree(me.mainFeeRateSheet,me.mainFeeRateSetting,me.mainFeeRateData); }, reFreshRateViews:function() { //feeRateObject.createSpreadView(); feeRateObject.loadPageContent(); this.showMainFeeRateData(); if(subRateObject.subRateSpread){//如果子费率没有初始化过的话,不需要显示。 subRateObject.initSubRateSpread(this.mainFeeRateData[0]); } }, onMainFeeRateSheetValueChange:function (e,info) { let me = feeRateObject,updateData = {},feeRate = projectObj.project.FeeRate; let recode = me.mainFeeRateData[info.row]; let fieldID = me.mainFeeRateSetting.header[info.col].dataCode; let value = info.newValue; if(fieldID == 'rate'&&value != null){ if(number_util.isNumber(parseFloat(value))){ value = scMathUtil.roundForObj(value,getDecimal("feeRate")); }else { alert('当前输入的数据类型不正确,请重新输入。'); me.mainFeeRateSheet.setValue(info.row, info.col, info.oldValue); return; } } if(recode[fieldID] == value){//没有改变 return; } updateData[fieldID] = value; $.bootstrapLoading.start(); feeRate.updateFeeRateByID(recode.ID,updateData,function () { if(fieldID == 'rate'){ feeRate.onFeeRateChange(recode.ID,value); } $.bootstrapLoading.end(); }) }, onMainFeeRateSelectChanged:function (e, info) { let me = feeRateObject; let row = info.newSelections[0].row; if(row!=-1){ subRateObject.initSubRateSpread(me.mainFeeRateData[row]); } }, updateBySelect:function (rate,selectMap,mapID) { let selected = this.mainFeeRateSheet.getSelections()[0]; projectObj.project.FeeRate.backupDatas(); let item = this.mainFeeRateData[selected.row]; item.rate = rate; for(let key in selectMap){ let recode = item.subFeeRate.recodes[key]; let optionList = recode.optionList; for(let o of optionList){ if(o.value==selectMap[key]){ o.selected=true; }else { o.selected = false; } } } if($('#cascadeSet').prop('checked')){ this.cascadeSetRates(item,selected.row,mapID,selectMap); }else { projectObj.project.FeeRate.batchUpdateFeeRate([{rateIndex:selected.row,rate:item}],feeRateObject.activateFeeRate); } }, cascadeSetRates:function(selectedItem,sourceRow,mapID,selectMap){ var items=[]; items.push({rateIndex:sourceRow,rate:selectedItem}); _.forEach(this.mainFeeRateData,function (recode,Index) { if(Index!=sourceRow&&recode.subFeeRate){ var valueMaps = recode.subFeeRate.valueMaps; var valueMap = _.find(valueMaps,{ID:mapID}); if(valueMap){//选项完全一样的情况 if(valueMap.value==recode.rate){ return; }else { recode.rate = valueMap.value; _.forEach(selectMap,function (value,key) { var tempRecode = recode.subFeeRate.recodes[key]; var optionList = tempRecode.optionList; _.forEach(optionList,function (o) { if(o.value==value){ o.selected = true; }else { o.selected = false; } }) }) items.push({rateIndex:Index,rate:recode}); } }else {//某条选项一样的情况 var needUpdate = false; var selectList = mapID.split('-'); var newList=[]; _.forEach(recode.subFeeRate.recodes,function (r) { var oList = r.optionList; var oldSelectIndex=0; var hasChange=false; _.forEach(oList,function (o,key) { if(o.selected){ oldSelectIndex = key; } if(_.includes(selectList,o.value)){ needUpdate=true; o.selected=true; hasChange=true; newList.push(o.value); }else { o.selected=false; } }) if(!hasChange){ oList[oldSelectIndex].selected=true; newList.push(oList[oldSelectIndex].value) } }) if(needUpdate){ var newValue = _.find(valueMaps,{ID:newList.join("-")})//取出费率值并更新 if(newValue){ if(recode.rate != newValue.value){ recode.rate = newValue.value items.push({rateIndex:Index,rate:recode}); } } } } } }) projectObj.project.FeeRate.batchUpdateFeeRate(items,feeRateObject.activateFeeRate); }, loadPageContent:function(){ var feeRateFile = projectObj.project.FeeRate.getActivateFeeRate(); var usageProjects = feeRateFile.usageProjects; $('#feeRateFileName').text(feeRateFile.name); $('#feeRateLibName').text(feeRateFile.libName); $('#projectCount').text(usageProjects.length); }, loadFeeRateSelection:function() { if(!this.selectionLoad){ var selectedID=0; _.forEach(projectObj.project.FeeRate.datas,function (data) { var option = $("