|
@@ -12,6 +12,20 @@ var feeRateObject={
|
|
|
needCascadeSet:false,
|
|
|
selectionLoad:false,
|
|
|
changeInfo:null,
|
|
|
+ feeRateSpreads:null,
|
|
|
+ editingCell:null,
|
|
|
+ feeRateSelection:null,
|
|
|
+ sheetSetting: {
|
|
|
+ header: [
|
|
|
+ {headerName: "专业名称", headerWidth: 200, dataCode: "name", dataType: "String"},
|
|
|
+ {headerName: "值%", headerWidth: 150, dataCode: "rate", dataType: "String",hAlign: "right"},
|
|
|
+ {headerName: "备注", dataCode: "memo", dataType: "String"}
|
|
|
+ ],
|
|
|
+ view: {
|
|
|
+ comboBox: [],
|
|
|
+ lockColumns: [0, 1, 2]
|
|
|
+ }
|
|
|
+ },
|
|
|
columns: [
|
|
|
{
|
|
|
id: 'name',
|
|
@@ -101,6 +115,236 @@ var feeRateObject={
|
|
|
|
|
|
}
|
|
|
},
|
|
|
+ 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 () {
|
|
|
+ var sheet= feeRateObject.feeRateSheet;
|
|
|
+ var setting=feeRateObject.sheetSetting;
|
|
|
+ var data = projectObj.project.FeeRate.getActivateFeeRate().rates;
|
|
|
+ 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('tofix')){
|
|
|
+ val =parseFloat(val).toFixed(setting.header[col].tofix);
|
|
|
+ }else {
|
|
|
+ val =parseFloat(val).toFixed(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 (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);
|
|
|
+ }
|
|
|
+ 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;
|
|
|
+ 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.x<offset&&hitinfo.x>offset-imageWidth){
|
|
|
+ me.showSelectModal(hitinfo);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ };
|
|
|
+ FeeRateEditCellType.prototype.processMouseLeave = function (hitinfo) {
|
|
|
+ feeRateObject.editingCell=null;
|
|
|
+ hitinfo.sheet.invalidateLayout();
|
|
|
+ hitinfo.sheet.repaint();
|
|
|
+ }
|
|
|
+ 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;i<children.length;i++){
|
|
|
+ sum+=me.getChildrenCount(children[i].ID,data);
|
|
|
+ }
|
|
|
+ return children.length+sum;
|
|
|
+ },
|
|
|
+ ifFeeRateEdit:function () {
|
|
|
+ var selected = projectObj.project.mainTree.selected;
|
|
|
+ return MainTreeCol.readOnly.forCalcBase(selected)?false:true;
|
|
|
+ },
|
|
|
createSpreadView:function () {
|
|
|
if (this.mainViews) {
|
|
|
this.mainViews.destroy();
|
|
@@ -369,6 +613,49 @@ var feeRateObject={
|
|
|
projectObj.project.FeeRate.synchronizeFeeRate();
|
|
|
}
|
|
|
projectObj.project.FeeRate.changeFeeRateFileFromOthers(feeRateFileID,name,callback);
|
|
|
+ },
|
|
|
+ setFeeRateCellCol:function (sheet,col) {
|
|
|
+ sheet.getRange(-1, col, -1, 1).cellType(this.getFeeRateEditCellType());
|
|
|
+ },
|
|
|
+ onCellClick:function (sender,args) {
|
|
|
+ var data =projectObj.project.FeeRate.getActivateFeeRate().rates;
|
|
|
+ feeRateObject.feeRateSelection=data[args.row];
|
|
|
+ },
|
|
|
+ onCellDoubleClick:function (sender,args) {
|
|
|
+ var data =projectObj.project.FeeRate.getActivateFeeRate().rates;
|
|
|
+ feeRateObject.feeRateSelection=data[args.row];
|
|
|
+ feeRateObject.submitFeeRateBySelect();
|
|
|
+ },
|
|
|
+ checkSelectedFeeRate:function () {
|
|
|
+ var validate = false;
|
|
|
+ var data =projectObj.project.FeeRate.getActivateFeeRate().rates;
|
|
|
+ if(feeRateObject.feeRateSelection!=null){
|
|
|
+ var children=_.filter(data,{'ParentID':feeRateObject.feeRateSelection.ID});
|
|
|
+ validate=children&&children.length==0;
|
|
|
+ }
|
|
|
+ return validate;
|
|
|
+ },
|
|
|
+ setFeeRateToBill:function () {
|
|
|
+ var rate = feeRateObject.feeRateSelection;
|
|
|
+ var selected = projectObj.project.mainTree.selected;
|
|
|
+ projectObj.project.FeeRate.setFeeRateToBill(rate,selected.data,function (data) {
|
|
|
+ selected.data.feeRateID=rate.ID.toString();
|
|
|
+ selected.data.feeRate=rate.rate.toString();
|
|
|
+ projectObj.mainController.refreshTreeNode([selected]);
|
|
|
+ $("#fee_rate_tree").modal('hide');
|
|
|
+ });
|
|
|
+ },
|
|
|
+ submitFeeRateBySelect:function () {
|
|
|
+ var validate = this.checkSelectedFeeRate();
|
|
|
+ if(validate){
|
|
|
+ if($('#edit_from').val()=='calc_detail'){
|
|
|
+ //do calc_detail
|
|
|
+ }else {
|
|
|
+ this.setFeeRateToBill();
|
|
|
+ }
|
|
|
+ }else {
|
|
|
+ //$("#fee_rate_tree").modal('hide');
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -527,3 +814,23 @@ $('#inlineFormCustomSelect').change(function(){
|
|
|
socket.emit('changeActivateFeeRate',{oldRoom:oldValue,newRoom:selectID});
|
|
|
})
|
|
|
|
|
|
+$('#fee_rate_tree').on('shown.bs.modal', function (e) {
|
|
|
+ if(feeRateObject.feeRateSpreads==null){
|
|
|
+ feeRateObject.createSheet();
|
|
|
+ }
|
|
|
+ feeRateObject.feeRateSelection=null;
|
|
|
+ feeRateObject.showSelectTree();
|
|
|
+});
|
|
|
+
|
|
|
+$('#fee_rate_tree').on('hidden.bs.modal', function (e) {
|
|
|
+ if(feeRateObject.feeRateSpreads){
|
|
|
+ feeRateObject.feeRateSpreads.destroy();
|
|
|
+ feeRateObject.feeRateSpreads=null;
|
|
|
+ $('#edit_from').val('');
|
|
|
+ $('#edit_row').val('');
|
|
|
+ }
|
|
|
+});
|
|
|
+
|
|
|
+$('#fee_selected_conf').bind('click',function (){
|
|
|
+ feeRateObject.submitFeeRateBySelect();
|
|
|
+})
|