/// <summary> /// 将报表对象转换为DSL串 /// </summary> /// <param name="report"></param> /// <returns></returns> private string Parse(MobileReport report) { string tableSchema = string.Empty; string reportStr; string rowData; if (report.Page == 0) //第一页 { tableSchema = DslTransfer.TransferToTableSchema(report); //Logger logger = Logger.GetLogger("DSLTransfer"); //logger.Info(tableSchema); //logger.Close(); byte[] bytes = Encoding.Default.GetBytes(tableSchema); tableSchema = Convert.ToBase64String(bytes); rowData = RetrieveRowData.TransferToRowData(report); reportStr = string.Format("<report><tableSchema>{0}</tableSchema>{1}</report>", tableSchema, rowData); } else { if (report.SemiRows != null) { string columnstr = this.GetCacheInfoFromSession(this._responseXml, "columnsString"); byte[] bytes = Convert.FromBase64String(columnstr); columnstr = Encoding.Default.GetString(bytes); rowData = RetrieveRowData.TransferToRowData(columnstr, report); reportStr = string.Format("<report>{0}</report>", rowData); } else { reportStr = null; } } return(reportStr); }
/// <summary> /// 准备报表数据 /// </summary> private void PrepairReportData(MobileReportDownloadTask task) { //_loginInfo = TokenTransfer.GetLoginInfo(task.Token); MobileReportEngine engine = new MobileReportEngine(task, _loginInfo); _mobileReport = engine.GetAllReport(null, task.Condition); }
/// <summary> /// 销毁当前任务 /// </summary> internal void DestroyTask() { PrepairReportDataError(this._task, this._loginInfo); this._loginInfo = null; this._mobileReport = null; this._task = null; this.Busy = false; }
/// <summary> /// 在分页加载时,通过移动前端传递过来的列头信息构造数据字符串 /// </summary> /// <param name="columnsInfoString">移动前端传递过来的列头信息字符串</param> /// <param name="report">MobileReport对象</param> /// <returns>结果DSL串</returns> internal static string TransferToRowData(string columnsInfoString, MobileReport report) { var rowBuilder = new StringBuilder(); var semirows = new SemiRows(); if (report != null) { semirows = report.SemiRows; } string[] columns = columnsInfoString.Split(','); foreach (SemiRow semiRow in semirows) { rowBuilder.Append("<row>"); if (semiRow.SectionType == SectionType.ReportSummary) // 如果当前行是总计行 { rowBuilder.Append(@"<column>总计</column>"); for (int i = 0; i < columns.Length; i++) { if (i == 0) { continue; } rowBuilder.Append(string.Format(@"<column>{0}</column>", semiRow[columns[i]])); } } else // 如果当前行是普通数据行 { foreach (string t in columns) { rowBuilder.Append(string.Format(@"<column>{0}</column>", semiRow[t])); } } rowBuilder.Append("</row>"); } return(rowBuilder.ToString()); }
internal static void SaveMobileReport(MobileReport mobileReport, ref string filePath) { #region 1.将报表格式信息存入数据库中 string tableSchema = DslTransfer.TransferToTableSchema(mobileReport); string root = GetU8Path(); var directoryPath = Path.Combine(root, @"U8AuditWebSite/MobileReport"); string guid = Guid.NewGuid().ToString(); string fileName = string.Format("ReportData{0}.db", guid); var cachePath = Path.Combine(root, string.Format(@"U8AuditWebSite/MobileReport/ReportData{0}.db", guid)); Directory.CreateDirectory(directoryPath); SQLiteConnection.CreateFile(cachePath); //连接数据库 var conn = new SQLiteConnection(); var connstr = new SQLiteConnectionStringBuilder { DataSource = cachePath }; conn.ConnectionString = connstr.ToString(); conn.Open(); //创建表 var cmd = new SQLiteCommand(); string sql = "drop table if exists TableSchema"; cmd.CommandText = sql; cmd.Connection = conn; cmd.ExecuteNonQuery(); sql = "CREATE TABLE TableSchema(tableSchema varchar(10000))"; cmd.CommandText = sql; cmd.Connection = conn; cmd.ExecuteNonQuery(); //插入数据 sql = string.Format("INSERT INTO TableSchema VALUES('{0}')", tableSchema); cmd.CommandText = sql; cmd.ExecuteNonQuery(); #endregion #region 2.报表数据存入数据库中 // 创建报表格式表 var cellList = new List <Cell>(); bool isMutiReport = false; Hashtable ht = new Hashtable(); Report report = mobileReport.Report; var supperCellList = new List <Cell>(); var childCellList = new List <Cell>(); if (mobileReport != null) { Section section = report.Sections[SectionType.PageTitle]; foreach (object gridDetailCell in section.Cells) { var cell = gridDetailCell as Cell; if (cell == null || !cell.Visible) { continue; } if (cell is SuperLabel) { isMutiReport = true; //如果列头存在superLable类型,则为多列头格式报表 supperCellList.Add(cell); } cellList.Add(gridDetailCell as Cell); } if (isMutiReport) { cellList = new List <Cell>(); section = report.Sections[SectionType.Detail]; foreach (object gridDetailCell in section.Cells) { var cell = gridDetailCell as Cell; if (cell != null && cell.Visible) { cellList.Add(gridDetailCell as Cell); childCellList.AddRange(from superCell in supperCellList where (cell.Super != null && cell.Super.Name == superCell.Name) select cell); } } } // 这里取pageTitle的一个对象来组成报表标题区域的值 //var section = report.Sections[SectionType.PageTitle]; //foreach (var gridDetailCell in section.Cells) //{ // var cell = gridDetailCell as Cell; // if (cell != null && cell.Visible) // { // cellList.Add(gridDetailCell as Cell); // } //} } // 应手机端开发人员要求,这里要通过后台设置各个列的次序等信息,采用f0,f1,f2,f3...等定位列头。 StringBuilder sb = new StringBuilder(); for (int i = 0; i < cellList.Count; i++) { sb.Append("f" + i); sb.Append(" varchar(50)"); sb.Append(","); } //foreach (var cell in cellList) //{ // sb.Append(cell.Name); // sb.Append(" varchar(50)"); // sb.Append(","); //} sb.Remove(sb.Length - 1, 1); sql = "drop table if exists ReportData"; cmd.CommandText = sql; cmd.Connection = conn; cmd.ExecuteNonQuery(); sql = string.Format("CREATE TABLE ReportData({0})", sb); cmd.CommandText = sql; cmd.Connection = conn; cmd.ExecuteNonQuery(); if (!isMutiReport) { // 将reportData第一行添加报表中文名称等信息。 sb = new StringBuilder(); sb.Append("insert into ReportData VALUES("); foreach (var cell in cellList) { sb.Append(string.Format("'{0}',", cell.Caption)); } sb.Remove(sb.Length - 1, 1); sb.Append(")"); sql = sb.ToString(); cmd.CommandText = sql; cmd.Connection = conn; cmd.ExecuteNonQuery(); } else //如果该报表属于多列头报表,首先从Detail中取得子列,并对列头进行特殊处理 { // 将reportData前两行添加报表中文名称等信息。 sb = new StringBuilder(); sb.Append("insert into ReportData VALUES("); foreach (var cell in cellList) { sb.Append(string.Format("'{0}',", childCellList.Contains(cell) ? cell.Super.Caption : cell.Caption)); } sb.Remove(sb.Length - 1, 1); sb.Append(")"); sql = sb.ToString(); cmd.CommandText = sql; cmd.Connection = conn; cmd.ExecuteNonQuery(); sb = new StringBuilder(); sb.Append("insert into ReportData VALUES("); foreach (var cell in cellList) { sb.Append(string.Format("'{0}',", cell.Caption)); } sb.Remove(sb.Length - 1, 1); sb.Append(")"); sql = sb.ToString(); cmd.CommandText = sql; cmd.Connection = conn; cmd.ExecuteNonQuery(); } // 插入报表数据 DbTransaction trans = conn.BeginTransaction(); // <--加入事务控制 try { foreach (SemiRow semiRow in mobileReport.SemiRows) { sb = new StringBuilder(); sb.Append("insert into ReportData VALUES("); foreach (var cell in cellList) { string value; if (semiRow[cell.Name] == null) { value = ""; } else { value = semiRow[cell.Name].ToString(); } if (value == "'") { value = "''"; } sb.Append(string.Format("'{0}',", value)); } sb.Remove(sb.Length - 1, 1); sb.Append(")"); sql = sb.ToString(); cmd.CommandText = sql; cmd.Connection = conn; cmd.ExecuteNonQuery(); } trans.Commit(); // <--提交事务 } catch (Exception exception) { trans.Rollback(); // <--失败则回滚 throw exception; } filePath = Path.ChangeExtension(fileName, ".txt"); var filePath1 = Path.ChangeExtension(cachePath, ".txt"); File.Copy(cachePath, filePath1); //File.Move(cachePath, filePath1); #endregion }
/// <summary> /// 在分页加载时,通过移动前端传递过来的列头信息构造数据字符串 /// </summary> /// <param name="columnsInfoString">移动前端传递过来的列头信息字符串</param> /// <param name="report">MobileReport对象</param> /// <returns>结果DSL串</returns> internal static string TransferToRowDataJson(string columnsInfoString, MobileReport report) { var rowBuilder = new StringBuilder(); var semirows = new SemiRows(); if (report != null) { semirows = report.SemiRows; } string[] columns = columnsInfoString.Split(','); rowBuilder.Append("\"data\":["); int j = 0; foreach (SemiRow semiRow in semirows) { rowBuilder.Append("{\"RowNumber\":"); rowBuilder.Append(string.Format("\"{0}\",", j.ToString())); //rowBuilder.Append(string.Format("{\"RowNumber\":\"{0}\"", j.ToString())); if (semiRow.SectionType == SectionType.ReportSummary) // 如果当前行是总计行 { rowBuilder.Append("\"level\":\"0\","); for (int i = 0; i < columns.Length; i++) { rowBuilder.Append(string.Format("\"{0}\":", columns[i].ToString())); if (i == 0) { rowBuilder.Append("\"总计\","); continue; } if (semiRow.Contains(columns[i])) { rowBuilder.Append(string.Format("\"{0}\",", (semiRow[columns[i]].ToString()).Replace("\n", "").Replace(" ", "").Replace("\t", "").Replace("\r", "").Replace("\"", ""))); } else { rowBuilder.Append("\"\","); } //rowBuilder.Append(string.Format("\"{0}\":\"{1}\"", columns[i].ToString(), semiRow[columns[i]])); } rowBuilder.Remove(rowBuilder.Length - 1, 1); rowBuilder.Append("},"); } else // 如果当前行是普通数据行 { foreach (string t in columns) { if (semiRow.Contains(t)) { rowBuilder.Append(string.Format("\"{0}\":\"{1}\",", t, semiRow[t].ToString().Replace("\n", "").Replace(" ", "").Replace("\t", "").Replace("\r", "").Replace("\"", "\\\""))); } else { rowBuilder.Append(string.Format("\"{0}\":\"{1}\",", t, "")); } } rowBuilder.Remove(rowBuilder.Length - 1, 1); rowBuilder.Append("},"); } //rowBuilder.Append("}"); j++; } if (semirows.Count != 0) { rowBuilder.Remove(rowBuilder.Length - 1, 1); } rowBuilder.Append("]}"); return(rowBuilder.ToString()); }
/// <summary> /// 打开一张报表 /// </summary> /// <param name="parameters"></param> /// <param name="filterString">下载时使用,直接传入过滤字符串</param> /// <param name="isGetAllDate">是否获取所有报表数据,为true则为被下载时调用</param> /// <returns></returns> public MobileReport OpenReport(Dictionary <string, string> parameters = null, string filterString = null, bool isGetAllDate = false) { var time = DateTime.Now; #region 1.LoadFormat 读取报表结构 System.Diagnostics.Trace.WriteLine("<<<<<<<<<<MobileReportTest>>>>>>>>>>OpenReport-->LoadFormat TaskID: " + _loginInfo.TaskID + " Start:" + time.ToString()); var reportEngine = new ReportEngine(this._loginInfo, ReportStates.Browse); //reportEngine.LoadFormat(null, this._viewId, null, null, null, null, null); System.Diagnostics.Trace.WriteLine("<<<<<<<<<<MobileReportTest>>>>>>>>>>OpenReport-->LoadFormat TaskID: " + _loginInfo.TaskID + " End:" + System.DateTime.Now.ToString()); System.Diagnostics.Trace.WriteLine("<<<<<<<<<<MobileReportTest>>>>>>>>>>OpenReport-->LoadFormat TaskID: " + _loginInfo.TaskID + " Use Time " + (DateTime.Now - time).ToString()); #endregion 1.LoadFormat 读取报表结构 #region 2.GetSql 与习文过滤交互,获取过滤对象 time = System.DateTime.Now; System.Diagnostics.Trace.WriteLine("<<<<<<<<<<MobileReportTest>>>>>>>>>>OpenReport-->GetSql TaskID: " + _loginInfo.TaskID + " Start:" + time.ToString()); // 调用习文的FilterSrv方法,构建FilterArgs的RawFilter部分 FilterSrv objfilter = new FilterSrvClass(); object err = null; objfilter.InitSolutionID = _solutionId; // 构建Filter对象_filter _filter = new FilterArgs(this._reportId, this._filterClass, this._loginInfo); this.InitFilter(ref _filter, this._loginInfo); //if (!isGetAllDate) // this.InitFilter2(ref _filter, this._loginInfo); _filter.RawFilter = objfilter; var filter1 = _filter.RawFilter as FilterSrv; // 创建业务组的自定义行为对象,传给过滤控件 if (!string.IsNullOrEmpty(_filter.FilterClass)) { var oComObj = Activator.CreateInstance( Type.GetTypeFromProgID(_filter.FilterClass)); filter1.BehaviorObject = oComObj; } filter1.FilterArgs.Add(_filter.Args["ufreportarg"], "ufreportarg"); bool flag = filter1.OpenFilter(this._loginInfo.U8Login, _filterId, null, null, ref err, true); if (flag) { UFGeneralFilter.FilterItemsClass filterItems = filter1.FilterList as FilterItemsClass; for (int i = 1; i < filterItems.Count + 1; i++) { ReportFilterService.FilterItem item = new ReportFilterService.FilterItem(filterItems[i].Key, filterItems[i].varValue); _filter.FltDAESrv.Add(item); _filter.FltSrv.Add(item); if (!String.IsNullOrEmpty(filterItems[i].DAEexpression1)) { ReportFilterService.FilterItem item1 = new ReportFilterService.FilterItem(filterItems[i].DAEexpression1, filterItems[i].varValue); _filter.FltDAESrv.Add(item1); _filter.FltSrv.Add(item); } } //1.初始化一个reportEngine对象 if (parameters == null) //下载时逻辑,直接传入 { _filter.DataSource.FilterString = this.FillCustomFilterString(objfilter, filterString); } else //界面打开时 { _filter.ViewID = this._viewId; _filter.DataSource.FilterString = this.FillCustomFilterString(objfilter, parameters); //_filter.DataSource.FilterString = JsonTransfer.VTransfer(_filter.DataSource.FilterString); //_filter.DataSource.FilterString = "1=1"; } } else { string errorInfo = err.ToString(); throw new InvalidEnumArgumentException("该报表有必输过滤项目没有设置默认值,请设置默认值重新查询!" + errorInfo); } // 从习文的过滤对象中取得值赋值给报表过滤对象 this.InitFilterArgsAfterOpenFilter(ref _filter, filter1.InitSolutionID); #endregion 2.GetSql 与习文过滤交互,获取过滤对象 System.Diagnostics.Trace.WriteLine("<<<<<<<<<<MobileReportTest>>>>>>>>>>OpenReport-->GetSql TaskID: " + _loginInfo.TaskID + " End:" + System.DateTime.Now.ToString()); System.Diagnostics.Trace.WriteLine("<<<<<<<<<<MobileReportTest>>>>>>>>>>OpenReport-->GetSql TaskID: " + _loginInfo.TaskID + " Use Time " + (DateTime.Now - time).ToString()); #region 3.OpenReport 调用业务组getSql方法获取数据源,打开一张报表 time = System.DateTime.Now; System.Diagnostics.Trace.WriteLine("<<<<<<<<<<MobileReportTest>>>>>>>>>>OpenReport-->OpenReport TaskID: " + _loginInfo.TaskID + " Start:" + time.ToString()); var engineAdapter = new MobileReportEngineAdapter(this._loginInfo); //这里有个GetSql()方法。 this._filterFlag = this.GetfilterFlag(); engineAdapter.OpenReport(_filter, _filterFlag, null, null, null, _baseTableName); // 参照BS的GetMessage,循环调用拉取数据 this._mobileReport = engineAdapter.GetReport(); // 如果是第一次打开新的报表 while (!this._mobileReport.PageEnd) { engineAdapter.GetMessage(); } this._mobileReport = engineAdapter.GetReport(); if (isGetAllDate)// 如果是下载全部报表数据,这里采用pageTo方法获取所有报表数据. { this._mobileReport.SemiRows = new SemiRows(); var mobileReport = this.PageTo(this._mobileReport.Report.CacheID, -1, -1); this._mobileReport.SemiRows = mobileReport.SemiRows; } System.Diagnostics.Trace.WriteLine("<<<<<<<<<<MobileReportTest>>>>>>>>>>OpenReport-->OpenReport TaskID: " + _loginInfo.TaskID + " End:" + System.DateTime.Now.ToString()); System.Diagnostics.Trace.WriteLine("<<<<<<<<<<MobileReportTest>>>>>>>>>>OpenReport-->OpenReport TaskID: " + _loginInfo.TaskID + " Use Time " + (DateTime.Now - time).ToString()); return(this._mobileReport); #endregion 3.OpenReport 调用业务组getSql方法获取数据源,打开一张报表 }
/// <summary> /// 下载时使用,获取全部报表数据 /// </summary> /// <param name="o"></param> /// <param name="condition"></param> /// <returns></returns> public MobileReport GetAllReport(Dictionary <string, string> parameters = null, string condition = null) { MobileReport report = this.OpenReport(parameters, condition, true); return(report); }
/// <summary> /// 新增供U易联调用的接口 /// </summary> /// <param name="login"></param> /// <param name="actionType"></param> /// <param name="parameters"></param> /// <param name="responseXml"></param> /// <returns></returns> public string Execute(U8LoginInfor login, string actionType, Dictionary <string, string> parameters, ref string responseXml) { string result = ""; bool is4chart = false; if (parameters.ContainsKey("is4chart")) { is4chart = Boolean.Parse(parameters["is4chart"]); } this._loginInfo = login; this._responseXml = responseXml; if (!this.CheckReportExist(parameters)) { result = "该查询方案不存在,可能已经取消发布到移动端,请确认!"; throw new Exception("该查询方案不存在,可能已经取消发布到移动端,请确认!"); } try { MobileReportEngine engine = new MobileReportEngine(this._loginInfo, actionType, parameters, ref responseXml); int startLine = Convert.ToInt32(this.GetInformationByKey("startline", parameters)); this._columnsStr = this.GetInformationByKey("columnsstring", parameters); int pageRowCount = 25; if (this.GetInformationByKey("count", parameters) != null) { pageRowCount = Convert.ToInt32(this.GetInformationByKey("count", parameters)); } engine.SetReportPageRowCount(pageRowCount); if (startLine == 1) //请求第一页数据 { this._mobileReport = engine.OpenReport(parameters); this._pageRowsCount = engine.GetReportPageRowCount(); //this._mobileReport = this.OpenReport(this._loginInfo, parameters); this._mobileReport.Page = 0; int totalpage = this._mobileReport.Report.RowsCount / this._pageRowsCount + 1; string reportCacheString = RetrieveRowData2Json.GetColumnsInfoString(this._mobileReport); this.SetCacheInfoIntoSession(ref responseXml, "currentpage", "1"); this.SetCacheInfoIntoSession(ref responseXml, "totalpage", totalpage.ToString()); byte[] bytes = Encoding.Default.GetBytes(reportCacheString); reportCacheString = Convert.ToBase64String(bytes); this.SetCacheInfoIntoSession(ref responseXml, "columnsString", reportCacheString); this.SetCacheInfoIntoSession(ref responseXml, "cacheid", this._mobileReport.Report.CacheID); } else { int pageIndex = Convert.ToInt32(this.GetCacheInfoFromSession(responseXml, "currentpage")); if (pageIndex == 0) { pageIndex = Convert.ToInt32(this.GetInformationByKey("currentpage", parameters)); //pageIndex = Convert.ToInt32(parameters["currentpage"].ToString()); } int totalpage = Convert.ToInt32(this.GetCacheInfoFromSession(responseXml, "totalpage")); if (totalpage == 0) { totalpage = Convert.ToInt32(this.GetInformationByKey("totalpage", parameters)); this._totolPage = totalpage.ToString(); } if (pageIndex + 1 > totalpage) { result = null; return(result); } else { string cacheId = GetCacheInfoFromSession(responseXml, "cacheid"); if (string.IsNullOrEmpty(cacheId)) { cacheId = this.GetInformationByKey("cacheid", parameters); this._cacheid = cacheId; } int lastIndex = -1; //this._mobileReport = this.PageTo(cacheId, pageIndex, lastIndex); this._mobileReport = engine.PageTo(cacheId, pageIndex, lastIndex); this.SetCacheInfoIntoSession(ref responseXml, "currentpage", (pageIndex + 1).ToString()); this._mobileReport.Page = pageIndex + 1; } } if (_mobileReport != null) { int pageIndex = Convert.ToInt32(this.GetCacheInfoFromSession(responseXml, "currentpage")); if (pageIndex == 0) { if (parameters.ContainsKey("currentpage")) { pageIndex = Convert.ToInt32(this.GetInformationByKey("currentpage", parameters)); } } // 由于CS端每页都需要显示总计行,这里需要将不是最后一页的总计行删除掉 //if (!bLastPage(pageIndex, _mobileReport.Report) && this._mobileReport.Report.Sections[SectionType.ReportSummary] != null) //{ // _mobileReport.SemiRows.RemoveAt(_mobileReport.SemiRows.Count - 1); //} // 如果是请求图表数据 if (is4chart) { var report = _mobileReport.Report; engine.InitMobileReportChartSchema(report); ChartService chartservice = new ChartService(report); ChartSchemas css = report.ChartSchemas; if (css.CurrentGroupChart.Items != null && css.CurrentGroupChart.Items.Count > 0) { ChartSchemaItem groupCharts = css.CurrentGroupChart.Items[1] as ChartSchemaItem; if (groupCharts != null) { foreach (ChartSchemaItemAmong among in groupCharts.Items.Values) { UltraChart designChart = MobileChartHelper.CreateAchartByDesignTime(among); var dataTable1 = chartservice.GetDataSource(groupCharts.Level, among.ID, null, designChart.ChartType); MobileChart mobileChart = new MobileChart(designChart.ChartType, dataTable1); string result1 = MobileChartHelper.TransferDataTableToString(mobileChart); MobileChartHelper.Desrialize <MobileChart>(mobileChart, result1); return(result1); } } } } System.Diagnostics.Trace.WriteLine("<<<<<<<<<<MobileReportTest>>>>>>>>>>OpenReport-->ParseReport TaskID: " + _loginInfo.TaskID + " Start:" + System.DateTime.Now.ToString()); result = ULinkParse(this._mobileReport); System.Diagnostics.Trace.WriteLine("<<<<<<<<<<MobileReportTest>>>>>>>>>>OpenReport-->ParseReport TaskID: " + _loginInfo.TaskID + " End:" + System.DateTime.Now.ToString()); } } catch (Exception ex) { if (ex.Message.Contains("无法将类型为“U8Login.clsLoginClass”的 COM 对象强制转换为接口类型“U8Login._clsLogin”") && !parameters.ContainsKey("AAA")) { parameters.Add("AAA", "1"); return(Execute(this._loginInfo, actionType, parameters, ref responseXml)); } else { throw ex; } } System.Diagnostics.Trace.WriteLine("<<<<<<<<<<MobileReportTest>>>>>>>>>>OpenReport-->ExecuteOpenReport TaskID: " + this._loginInfo.UserToken + " End:" + System.DateTime.Now.ToString()); return(result); }
private string ULinkParse(MobileReport report) { string tableSchema = string.Empty; string reportStr; string rowData; if (report.Page == 0) //第一页 { //tableSchema = JsonTransfer.TransferToTableSchema(report); //byte[] bytes = Encoding.Default.GetBytes(tableSchema); //tableSchema = Convert.ToBase64String(bytes); rowData = RetrieveRowData2Json.TransferToRowData(report); StringBuilder sb = new StringBuilder(); sb.Append("{"); sb.Append("\"resresult\":{"); sb.Append("\"flag\": \"0\","); sb.Append("\"currentpage\": \""); sb.Append(string.IsNullOrEmpty(this._currentPage) ? "" : this._currentPage + "\","); sb.Append("\"totalpage\": \""); sb.Append(string.IsNullOrEmpty(this._totolPage) ? "" : this._totolPage + "\","); sb.Append("\"columnsstring\": \""); sb.Append(string.IsNullOrEmpty(this._columnsStr) ? "" : this._columnsStr + "\","); sb.Append("\"cacheid\": \""); sb.Append(string.IsNullOrEmpty(this._cacheid) ? "" : this._cacheid + "\","); sb.Append("\"desc\": \"查询报表详情成功!\","); sb.Append("\"resdata\": "); sb.Append(string.Format("{0}", rowData)); sb.Append("}}"); reportStr = sb.ToString(); //reportStr = string.Format("<report><tableSchema>{0}</tableSchema>{1}</report>", tableSchema, rowData); } else { if (report.SemiRows != null) { string columnstr = this.GetCacheInfoFromSession(this._responseXml, "columnsString"); try { byte[] bytes = Convert.FromBase64String(columnstr); columnstr = Encoding.Default.GetString(bytes); } catch { columnstr = this._columnsStr; } rowData = RetrieveRowData2Json.TransferToRowDataJson(columnstr, report); StringBuilder sb = new StringBuilder(); sb.Append("{"); sb.Append("\"resresult\":{"); sb.Append("\"flag\": \"0\","); sb.Append("\"currentpage\": \""); sb.Append(string.IsNullOrEmpty(this._currentPage) ? "" : this._currentPage + "\","); sb.Append("\"totalpage\": \""); sb.Append(string.IsNullOrEmpty(this._totolPage) ? "" : this._totolPage + "\","); sb.Append("\"columnsstring\": \""); sb.Append(string.IsNullOrEmpty(this._columnsStr) ? "" : this._columnsStr + "\","); sb.Append("\"cacheid\": \""); sb.Append(string.IsNullOrEmpty(this._cacheid) ? "" : this._cacheid + "\","); sb.Append("\"desc\": \"查询报表详情成功!\","); sb.Append("\"resdata\":{"); sb.Append(string.Format("{0}", rowData)); sb.Append("}}"); reportStr = sb.ToString(); //reportStr = string.Format("<report>{0}</report>", rowData); } else { reportStr = null; } } return(reportStr); }
public override ActionResult Execute(string token, string actionType, Dictionary <string, string> parameters, ref string responseXml) { System.Diagnostics.Trace.WriteLine("<<<<<<<<<<MobileReportTest>>>>>>>>>>OpenReport-->ExecuteOpenReport TaskID: " + token + " Start:" + System.DateTime.Now.ToString()); this.Init(token, actionType, parameters, ref responseXml); this._responseXml = responseXml; var result = new ActionResult() { Action = actionType, Flag = 1, Description = "调用失败", ResultData = null }; if (!this.CheckReportExist(parameters)) { result.Description = "该查询方案不存在,可能已经取消发布到移动端,请确认!"; return(result); } try { var engine = new MobileReportEngine(token, actionType, parameters, ref responseXml); int startLine = Convert.ToInt32(this.GetInformationByKey("startline", parameters)); if (startLine == 1) //请求第一页数据 { this._mobileReport = engine.OpenReport(parameters); this._pageRowsCount = engine.GetReportPageRowCount(); //this._mobileReport = this.OpenReport(this._loginInfo, parameters); this._mobileReport.Page = 0; int totalpage = this._mobileReport.Report.RowsCount / this._pageRowsCount + 1; string reportCacheString = RetrieveRowData.GetColumnsInfoString(this._mobileReport); this.SetCacheInfoIntoSession(ref responseXml, "currentpage", "1"); this.SetCacheInfoIntoSession(ref responseXml, "totalpage", totalpage.ToString()); byte[] bytes = Encoding.Default.GetBytes(reportCacheString); reportCacheString = Convert.ToBase64String(bytes); this.SetCacheInfoIntoSession(ref responseXml, "columnsString", reportCacheString); this.SetCacheInfoIntoSession(ref responseXml, "cacheid", this._mobileReport.Report.CacheID); } else { int pageIndex = Convert.ToInt32(this.GetCacheInfoFromSession(responseXml, "currentpage")); if (pageIndex == 0) { pageIndex = Convert.ToInt32(parameters["currentpage"].ToString()); } int totalpage = Convert.ToInt32(this.GetCacheInfoFromSession(responseXml, "totalpage")); if (totalpage == 0) { totalpage = Convert.ToInt32(parameters["totalpage"].ToString()); this._totolPage = totalpage.ToString(); } if (pageIndex + 1 > totalpage) { result.ResultData = null; result.Flag = 0; return(result); } else { string cacheId = GetCacheInfoFromSession(responseXml, "cacheid"); if (string.IsNullOrEmpty(cacheId)) { cacheId = parameters["cacheid"].ToString(); this._cacheid = cacheId; } int lastIndex = -1; //this._mobileReport = this.PageTo(cacheId, pageIndex, lastIndex); this._mobileReport = engine.PageTo(cacheId, pageIndex, lastIndex); this.SetCacheInfoIntoSession(ref responseXml, "currentpage", (pageIndex + 1).ToString()); this._mobileReport.Page = pageIndex + 1; } } if (_mobileReport != null) { System.Diagnostics.Trace.WriteLine("<<<<<<<<<<MobileReportTest>>>>>>>>>>OpenReport-->ParseReport TaskID: " + _loginInfo.TaskID + " Start:" + System.DateTime.Now.ToString()); result.ResultData = Parse(this._mobileReport); System.Diagnostics.Trace.WriteLine("<<<<<<<<<<MobileReportTest>>>>>>>>>>OpenReport-->ParseReport TaskID: " + _loginInfo.TaskID + " End:" + System.DateTime.Now.ToString()); result.Flag = 0; result.Description = "获取报表成功"; } } catch (Exception ex) { result.Flag = 1; result.Description = "获取报表数据失败:" + ex.Message; if (ex.Message.Contains("无法将类型为“U8Login.clsLoginClass”的 COM 对象强制转换为接口类型“U8Login._clsLogin”") && !parameters.ContainsKey("AAA")) { parameters.Add("AAA", "1"); return(Execute(token, actionType, parameters, ref responseXml)); } } System.Diagnostics.Trace.WriteLine("<<<<<<<<<<MobileReportTest>>>>>>>>>>OpenReport-->ExecuteOpenReport TaskID: " + token + " End:" + System.DateTime.Now.ToString()); return(result); }