analysisModule.directive('tableReportSheet', ['$rootScope', '$log', '$timeout', '$q', 'templateService', 'enums', 'keyValueDataService', 'spreadJsTipService', '$interval', 'vatSessionService', function ($rootScope, $log, $timeout, $q, templateService, enums, keyValueDataService, spreadJsTipService, $interval, vatSessionService) { 'use strict'; $log.debug('tableReportSheet.ctor()...'); return { restrict: 'E', template: '<div class="report" style="height: 100%;width: 100%;"></div>', replace: true, scope: { templateId: '=', spread: '=', reportSource: '=', formulaBlocks: '=', manualDataSources: '=', isReadOnly: '=', serviceType: '=', initRow: '=?', initCol: '=?', reportApi: '=?', // In: onCellClick, onCellDoubleClick; Out: refreshReport, relation: '=' }, link: function (scope, element) { $log.debug('vatReportSheet.link()...'); // Register api functions in internalApi // If selectorApi passed is not undefined, we will use it as internalApi scope.internalApi = scope.reportApi || {}; scope.projectYear = vatSessionService.year; scope.projectPeriod = scope.serviceType === enums.serviceType.VAT ? vatSessionService.month : 0; var profileList = ["EBIT考虑资产减值损失", "加:特殊因素考虑", "EBIT(考虑特殊因素)", "EBIT rate", "关联交易金额", "6%增值税", "价税合计金额"]; // 首次进入页面时,通过promise模式保证在加载完成后再调用locateCell以focus在特定单元格 // 如果是在当前页面要focus在特定单元格,通过watch行列号来完成 /* scope.$watchGroup(['initRow', 'initCol'], function (newVal, oldVal) { if (_.isNumber(scope.initRow) && _.isNumber(scope.initCol)) { var spreadCtrl = getSpreadControl(); if (spreadCtrl) { locateCell(spreadCtrl); } spreadCtrl = null; } });*/ /* var locateCell = function (spread, forceCloseModal) { if (_.isNumber(scope.initRow) && _.isNumber(scope.initCol)) { var sheet; if (constant.regesterInformation.active) { sheet = spread.getActiveSheet(); } else { sheet = spread.getSheet(1); } //var sheet = spread.getActiveSheet(); //var sheet = spread.getSheet(1); sheet.setSelection(scope.initRow, scope.initCol, 1, 1); if (_.isFunction(scope.internalApi.onCellClick) && !forceCloseModal) { scope.internalApi.onCellClick({ 'args': {row: scope.initRow, col: scope.initCol}, 'data': JSON.parse(sheet.getTag(scope.initRow, scope.initCol)) }); } $log.debug(sheet.getTag(scope.initRow, scope.initCol)); scope.initRow = null; scope.initCol = null; sheet = null; return $q.when(); } };*/ /* scope.$watchGroup(['relation.period', 'relation.orgId', 'relation.data'], function (newValue, oldValue) { if (scope.relation.orgId != null && scope.relation.period != null) { /!* setTimeout(function () { if ((scope.relation.broadcast && scope.relation.broadcast == true) || scope.spread != undefined) { loadSheet(scope.templateId, false) } else { loadSheet(scope.templateId, true); } }, 200);*!/ loadSheet(scope.templateId); } }); scope.$watch('relation.broadcast', function (newValue, oldValue) { if (scope.relation.orgId != null && scope.relation.period != null) { // loadSheet(scope.templateId, false) loadSheet(scope.templateId) } });*/ var loadSheet = function (templateId ) { //var prokjectId = vatSessionService.project.id; //var period = vatSessionService.month; /* if (!init) { scope.relation.addEbitRow(); setData(init) return; }*/ if(scope.relation.orgId == undefined){ scope.relation.orgId = null; } if(templateId == undefined ) return; return templateService.getPeriodTemplateJsonByOrg(templateId, scope.relation.period, scope.relation.orgId).then(function (reportSpread) { var spreadCtrl = getSpreadControl(); if (spreadCtrl) { spreadCtrl.destroy(); } spreadCtrl = null; if (!_.isEmpty(reportSpread)) { initSpreadExcel(reportSpread).then(function (spread) { /* return locateCell(spread, true);*/ }); } }, function (data) { $log.info(data); }); }; //初始化spread /* var _init = function(){ return templateService.getPeriodTemplateJsonByOrg(templateId, scope.relation.period, scope.relation.orgId).then(function (reportSpread) { if (!_.isEmpty(reportSpread)) { var spreadCtrl = getSpreadControl(); if (spreadCtrl) { spreadCtrl.destroy(); } spreadCtrl = null; initSpreadExcel(reportSpread, true).then(function (spread) { /!* return locateCell(spread, true);*!/ }); } }, function (data) { $log.info(data); }); }*/ var setColWidth = function(sheet){ for(var i = 0; i < sheet.getColumnCount(); i++){ if(i ==0){ sheet.setColumnWidth(0, 360) continue } sheet.setColumnWidth(i, 180); } } //创建自定义格式 function CustomPerFormat() { } CustomPerFormat.prototype = new GC.Spread.Formatter.FormatterBase(); CustomPerFormat.prototype.format = function (obj, formattedData) { return perFormat(obj, formattedData); } function perFormat(value, formattedData){ value = value.toString(); if(0 <= value <= 100){ if( value.indexOf("%") != -1){ value += "%"; } }else{ formattedData.conditionalForeColor = "red"; } return value; } var initSpreadExcel = function (reportSpread) { var spread = getSpreadControl(); spread.suspendPaint(); spread.fromJSON(reportSpread); spread.options.showVerticalScrollbar = true; spread.options.showHorizontalScrollbar = true; spread.options.scrollbarMaxAlign = true; spread.options.scrollbarShowMax = true; spread.options.tabNavigationVisible = true; if (constant.regesterInformation.active) { spread.options.tabEditable = false; spread.options.tabStripVisible = false; spread.options.newTabVisible = false; } spread.options.allowUndo = false; spread.options.allowUserResize = false; spread.options.allowUserDragDrop = false; spread.options.allowUserDragFill = false; spread.options.allowUserEditFormula = false; spread.options.allowContextMenu = false; initInterFunction(spread); //todo:注册之后这里去掉注释 //var sheet = spread.getActiveSheet(); var sheet; if (constant.regesterInformation.active) { sheet = spread.getActiveSheet(); } else { sheet = spread.getSheet(1); } if (sheet != null) { sheet.options.rowHeaderVisible = true; sheet.options.colHeaderVisible = true; sheet.options.gridline.showVerticalGridline = true; sheet.options.gridline.showHorizontalGridline = true; sheet.options.isProtected = true; sheet.clearSelection(); } scope.spread = spread; scope.relation.sheet = spread.getActiveSheet(); setColWidth(sheet); if(sheet.getRowCount() <= 38) scope.relation.addEbitRow(sheet) if (scope.templateId && scope.reportSource) { setData(); } sheet.setRowResizable(0,false,GC.Spread.Sheets.SheetArea.viewport); spread.resumePaint(); return $q.when(spread); }; scope.relation.addEbitRow = function (sheet) { if (sheet == undefined || sheet == null) sheet = scope.spread.getActiveSheet(); //添加单元格 if (sheet.getRowCount() > 43) return; sheet.addRows(sheet.getRowCount(scope.relation.sheetArea.viewport), 1); sheet.addRows(sheet.getRowCount(scope.relation.sheetArea.viewport), 1); sheet.addRows(sheet.getRowCount(scope.relation.sheetArea.viewport), 1); for (var i = 0; i <= 7; i++) { sheet.addRows(sheet.getRowCount(scope.relation.sheetArea.viewport), 1); sheet.setValue(i + 37, 0, profileList[i]); } scope.relation.lockCell(scope.spread); } scope.relation.lockCell = function (spread) { //todo:注册之后这里去掉注释 var sheet; if (constant.regesterInformation.active) { sheet = spread.getActiveSheet(); } else { sheet = spread.getSheet(1); } for (var i = 0; i <= 36; i++) { for (var j = 0; j <= 5; j++) { sheet.getCell(i, j).locked(true); } } ///解锁指定单元格 sheet.getCell(38, 2).locked(false);//特殊因素 sheet.getCell(40, 2).locked(false);//ebit比率 // sheet.setFormatter( 38, 2,"0.00"); sheet.setFormatter( 40, 2,"0.00%"); //sheet.setFormatter(40, 2, new CustomPerFormat()); //sheet.getCell(40, 2).formatter(new CustomPerFormat()); }; // 每个单元格大致由以下部分构成:_SumAll(_Inter(...)+_Manual(...)+C1) // _Inter: IronPython公式计算结果 // _Manual: 手工数据源值 // C1: 类似的Excel公式,通过SpreadJS公式引擎计算 var initInterFunction = function (spread) { var activeSheet; if (constant.regesterInformation.active) { activeSheet = spread.getActiveSheet(); } else { activeSheet = spread.getSheet(1); } var manualFunc = function () { }; manualFunc.prototype = new GC.Spread.CalcEngine.Functions.Function("_Manual", 1, 1); manualFunc.prototype.evaluate = function (args) { if (!_.isString(args)) { return "#VALUE!"; } //var cellTemplateID = Number(args); var ds = _.where(scope.manualDataSources, {item1: args}); if (!_.isEmpty(ds)) { return _.reduce(ds, function (memo, x) { if (x.item2.dataSourceType === 6) { var rtn = x.item2.amount; rtn = PWC.tryParseStringToNum(rtn); // 如果是数值数据源,只有OperationType为2时,该数据源的数值应被减去;其他情况下应被加上 if (_.isNumber(rtn) && !isNaN(rtn)) { var operationType = x.item2.operationType; rtn = operationType === 2 ? (-rtn) : rtn; } return memo + rtn; } else { return memo; } }, 0); } return 0; }; spread.clearCustomFunctions(); activeSheet.addCustomFunction(new manualFunc()); }; // Get spreadJS control. var getSpreadControl = function () { scope.relation.sheetArea = GC.Spread.Sheets.SheetArea; return new GC.Spread.Sheets.Workbook(getSpreadControlElement()); }; // Get spreadJS control element var getSpreadControlElement = function () { //var elem = document.getElementsByClassName('report-view'); var elem = document.getElementById('r_' + scope.templateId); if (!elem) { var elems = document.getElementsByClassName('report'); if (!elems || elems.length === 0) { return undefined; } return elems[0]; } return elem; }; // 根据已有信息通过spreadJS计算各单元格的值 var setData = function (upload) { var sheet = scope.spread.sheets[0]; /* if (!init && scope.relation.broadcast == true) { scope.relation.loadEbitCell(sheet); return; }*/ if(upload){ //上传上来的文件也要动态添加行 scope.relation.addEbitRow(sheet); scope.relation.loadEbitCell(sheet); scope.relation.lockCell(scope.spread); setColWidth(sheet); scope.spread.resumePaint(); return }else{ scope.relation.loadEbitCell(sheet); } if (angular.isArray(scope.reportSource)) { //spreadJsTipService.initialize(sheet); /*if (!scope.isReadOnly) { scope.relation.lockCell(scope.spread, false, true); }*/ scope.spread.suspendPaint(); /* if (scope.reportSource.length == 0 && scope.relation.emptyData && scope.relation.emptyData == true) { _init(scope.templateId, true);///如果没有数据,需要重新加载 scope.relation.lockCell(scope.spread); return; } */ scope.reportSource.forEach(function (data) { //fix bug11737 导出需要显示千分位 // 避免直接使用data.value = parseFloat(data.value)导致非数字型value无法显示 data.value = PWC.tryParseStringToNum(data.value); //var cell = sheet.getCell(data.rowIndex, data.columnIndex); if (_.isNumber(data.value) && !isNaN(data.value)) { data.value = data.value.toFixed(4); } sheet.setValue(data.rowIndex, data.columnIndex, data.value); // 只有数值,设置为数值 }); // 设置破折号单元格的值和显示格式,将其替换为带破折号格式的0值,这样引用到的其他单元格才能正常计算 var rowCount = sheet.getRowCount(); var columnCount = sheet.getColumnCount(); for (var r = 0; r < rowCount; r++) { for (var c = 0; c < columnCount; c++) { var cell = sheet.getCell(r, c); if (cell.value() === '——') { cell.value(0); cell.formatter("[=0]——;0.00"); } } } scope.relation.lockCell(scope.spread); scope.spread.resumePaint(); scope.relation.saveToDbFlag = Math.random(); } }; scope.relation.setData = setData;//绑定单元格数据设置 scope.relation.loadSheet = loadSheet;//绑定单元格加载 (function initialize() { loadSheet(scope.templateId); })(); } }; } ]);