/** * Created by chen on 2017/8/1. */ var feeRateObject={ mainFeeRateSpread:null, mainFeeRateSheet:null, mainFeeRateData:null, mainFeeRateSetting:{ header: [ {headerName: "专业名称", headerWidth: 250, dataCode: "name", dataType: "String"}, {headerName: "值%", headerWidth: 80, dataCode: "rate", dataType: "Number",hAlign: "right",decimalField:"feeRate"}, {headerName: "备注", headerWidth: 150, 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){//有子节点时不能编辑费率列 return false; } return true; }, 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){ let checkResult = scMathUtil.isNumOrFormula(value); if(checkResult!=null){ value = scMathUtil.roundForObj(checkResult,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 () { me.mainFeeRateSheet.setValue(info.row, info.col, value); if(fieldID == 'rate'){ feeRate.onFeeRateChange(recode.ID,value); } $.bootstrapLoading.end(); })*/ feeRateObject.updateFeerateWhenCellsChange([info]); }, onMainFeeRateRangeChanged:function (e,info) { let me = feeRateObject; let changeCells = []; for(let c of info.changedCells){ let tem = { row:c.row, col:c.col, newValue:info.sheet.getCell(c.row,c.col).value() }; changeCells.push(tem); } me.updateFeerateWhenCellsChange(changeCells); }, updateFeerateWhenCellsChange:function (cells) {// col,row,newValue let me = feeRateObject,updateDatas = [],feeRate = projectObj.project.FeeRate;//[{rateID:rateID,doc:doc}] let refreshA = [];//记录刷新条数的数组 for(let c of cells){ let temData = {}; let recode = me.mainFeeRateData[c.row]; let fieldID = me.mainFeeRateSetting.header[c.col].dataCode; let value = c.newValue; let oldValue = recode[fieldID]; if(!me.mainFeeRateEditChecking(c.row, c.col)){ me.mainFeeRateSheet.setValue(c.row, c.col, oldValue); continue; }else if(fieldID == 'rate'&&value != null){ let checkResult = scMathUtil.isNumOrFormula(value); if(checkResult!=null && !isNaN(checkResult)){ value = scMathUtil.roundForObj(checkResult,getDecimal("feeRate")); }else { setTimeout(function () { alert('当前输入的数据类型不正确,请重新输入。'); },100); me.mainFeeRateSheet.setValue(c.row, c.col, oldValue); continue; } } if(recode[fieldID] == value){//没有改变 continue; } temData[fieldID] = value ; updateDatas.push({rateID:recode.ID,doc:temData}); refreshA.push({col:c.col,row:c.row,fieldID:fieldID,value:value,rateID:recode.ID}); } if(updateDatas.length > 0){ $.bootstrapLoading.start(); feeRate.updateFeeRatesByIDs(updateDatas,function () { let feerateInfo = []; for(let r of refreshA){ me.mainFeeRateSheet.setValue(r.row, r.col, r.value); if(r.fieldID == 'rate'){ feerateInfo.push({rateID:r.rateID,value:r.value}); } } feerateInfo.length > 0 ?feeRate.onFeeRatesChange(feerateInfo):''; $.bootstrapLoading.end(); }) } }, onMainFeeRateSelectChanged:function (e, info) { let me = feeRateObject; let row = info.newSelections[0].row; me.onMainFeeRateSelect(row); }, onMainFeeRateSelect:function (row) { let me = this; 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){ let items=[]; items.push({rateIndex:sourceRow,rate:selectedItem}); _.forEach(this.mainFeeRateData,function (recode,Index) { if(Index!=sourceRow&&recode.subFeeRate){ let valueMaps = recode.subFeeRate.valueMaps; let valueMap = _.find(valueMaps,{ID:mapID}); if(valueMap){//选项完全一样的情况 if(valueMap.value==recode.rate){ return; }else { recode.rate = valueMap.value; _.forEach(selectMap,function (value,key) { let tempRecode = recode.subFeeRate.recodes[key]; let 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 {//某条选项一样的情况 let needUpdate = false; let selectList = mapID.split('-'); let newList=[]; _.forEach(recode.subFeeRate.recodes,function (r) { let oList = r.optionList; let oldSelectIndex=0; let 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){ let 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 = $("