diff --git a/end/reportWeb/Controllers/DesignController.cs b/end/reportWeb/Controllers/DesignController.cs index b02d469..2546093 100644 --- a/end/reportWeb/Controllers/DesignController.cs +++ b/end/reportWeb/Controllers/DesignController.cs @@ -28,6 +28,7 @@ using System.Text.RegularExpressions; using reportWeb.Pages; using SqlKata.Execution; +using System.Xml; namespace reportWeb.Controllers { [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)] @@ -491,23 +492,32 @@ string getReal_path(string target, String file_type) return Json(new { errcode = 1, message = "非法命令" }); } return Json(new { errcode = 0, message = "保存成功" }); - - } [HttpPost] - public async Task Open(String reportName, string zb_dict_str, string zb_param) + public async Task Open(String reportName, string cur_version = "") { if (reportName.StartsWith("/")) reportName = reportName.Substring(1); + if (cur_version == null) + cur_version = ""; var file_path = Path.Combine(this.rpt_group.report_path, reportName); if (file_path.StartsWith(this.rpt_group.report_path) && System.IO.File.Exists(file_path)) { using Env parent_env = new Env("open"); await XmlReport.templateValue2Env(this.rpt_group.report_path, reportName, parent_env); - var xmlDoc = (await XmlReport.getReportXmlDoc(this.rpt_group.report_path, reportName, isDesign: true)).xml; - //var ret = XmlReport.reportToXmlDocumnt(XmlReport.loadReport(file_path), false).OuterXml; - //var report_content = await System.IO.File.ReadAllTextAsync(file_path, System.Text.Encoding.UTF8); + + XmlDocument xmlDoc; + var versions = ReportVersions(reportName); + if (cur_version == "" || cur_version == versions[0][0]) + { + xmlDoc = (await XmlReport.getReportXmlDoc(this.rpt_group.report_path, reportName, isDesign: true)).xml; + } + else + { + cur_version = DateTime.Parse(cur_version).ToString("yyyy_MM_dd_HH_mm_ss"); + xmlDoc = (await XmlReport.getReportXmlDoc(this.rpt_group.report_path, ".backup/" + reportName + cur_version, isDesign: true)).xml; + } var conn_list = from x in this.rpt_group.db_connection_list select x.name; var ttt = await range_level(xmlDoc.OuterXml, reportName); return Json(new @@ -516,12 +526,34 @@ public async Task Open(String reportName, string zb_dict_str, str conn_list, range_level = ttt.range_level, defaultsetting = ttt.defaultsetting, + versions, parent_defaultsetting = new Dictionary((from x in parent_env.TemplateGet("out_keys").Split(",") select new KeyValuePair(x, parent_env.TemplateGet(x)))) } ); } return Json(new { errcode = 1, message = "路径错误" }); } + + private List ReportVersions(string reportName) + { + var versions = new List(); + var back_file_info = new FileInfo(Path.Combine(this.rpt_group.report_path, ".backup", reportName + "_desc")); + versions.Add(new String[] { new FileInfo(Path.Combine(this.rpt_group.report_path, reportName)).LastWriteTime.ToString("yyyy-MM-dd HH:mm:ss"), "当前版本" }); + //versions.Add("当前版本"); + if (System.IO.File.Exists(back_file_info.FullName)) + { + versions.AddRange(System.IO.File.ReadAllText(back_file_info.FullName).Split(version_split).Skip(1).Select(x => + { + return (new String[] { x.Substring(0, "yyyy-MM-dd HH:mm:ss".Length), x.Substring("yyyy-MM-dd HH:mm:ss".Length).Trim() }); + }).Reverse()); + if (versions[1][0] == versions[0][0]) + { + versions.RemoveAt(0); + } + } + return versions; + } + private async Task insert_ds_param(string reportName, string zb_dict_str, string zb_param) { var file_path = Path.Combine(this.rpt_group.report_path, reportName); @@ -645,13 +677,14 @@ private async Task insert_ds_param(string reportName, string zb_dict_str, string xmlDoc.Save(file_path); } - public async Task Save(String reportName, String content, string zb_dict_str, string zb_param, IFormFile imgFile) + public async Task Save(String reportName, String content, String cur_version, IFormFile imgFile, string desc) { if (reportName.StartsWith("/")) reportName = reportName.Substring(1); if (!Directory.Exists(this.rpt_group.report_path)) Directory.CreateDirectory(this.rpt_group.report_path); var file_path = Path.Combine(this.rpt_group.report_path, reportName); + if (file_path.StartsWith(this.rpt_group.report_path)) { var fileInfo = new FileInfo(file_path); @@ -665,22 +698,49 @@ public async Task Save(String reportName, String content, string } return Json(new { errcode = 0, message = "保存图片成功" }); ; } - if (!fileInfo.Exists || (fileInfo.Exists && String.IsNullOrEmpty(zb_dict_str))) - { - System.Xml.XmlDocument xmlDoc = Content2XmlDoc(content.Replace("\r", "")); - xmlDoc.Save(file_path); - XmlReport.MemoryCacheInstance.Remove(file_path); - } - if (!String.IsNullOrEmpty(zb_dict_str)) - { - await insert_ds_param(reportName, zb_dict_str, zb_param); + var now_time = DateTime.Now; + var all_versions = ReportVersions(reportName); + var LastWriteTime = fileInfo.LastWriteTime.ToString("yyyy-MM-dd HH:mm:ss"); + var interval_day = TimeSpan.FromDays(configuration.GetValue("auto_save_interval_day", 7.0d)); + var back_file_path = Path.Combine(this.rpt_group.report_path, ".backup", reportName + now_time.ToString("yyyy_MM_dd_HH_mm_ss")); + var back_fileInfo = new FileInfo(back_file_path); + if (!Directory.Exists(back_fileInfo.DirectoryName)) + Directory.CreateDirectory(back_fileInfo.DirectoryName); + + if (fileInfo.Exists && fileInfo.LastWriteTime.ToString("yyyy-MM-dd HH:mm:ss") != cur_version) + {//旧版本报表覆盖新版本报表,先备份旧版本 + System.IO.File.Copy(file_path, back_file_path); + System.IO.File.AppendAllLines(Path.Combine(this.rpt_group.report_path, ".backup", reportName + "_desc") + , new String[] { version_split + now_time.ToString("yyyy-MM-dd HH:mm:ss"), + $"恢复旧版本【{cur_version}】前的备份" + }); + } + else if (fileInfo.Exists && now_time - fileInfo.LastWriteTime > interval_day) + {//超过指定间隔时间 + System.IO.File.Copy(file_path, back_file_path); + System.IO.File.AppendAllLines(Path.Combine(this.rpt_group.report_path, ".backup", reportName + "_desc") + , new String[] { version_split + now_time.ToString("yyyy-MM-dd HH:mm:ss"), + $"间隔超过{interval_day}天自动对【{LastWriteTime}】备份" + }); + } + //保存报表 + System.Xml.XmlDocument xmlDoc = Content2XmlDoc(content.Replace("\r", "")); + xmlDoc.Save(file_path); + + if (!string.IsNullOrWhiteSpace(desc)) + {//如果有版本描述,备份当前报表 + System.IO.File.Copy(file_path, back_file_path); + System.IO.File.AppendAllLines(Path.Combine(this.rpt_group.report_path, ".backup", reportName + "_desc") + , new String[] { version_split + now_time.ToString("yyyy-MM-dd HH:mm:ss"), desc }); } - return Json(new { errcode = 0, message = "保存成功" }); + XmlReport.MemoryCacheInstance.Remove(file_path); + return Json(new { errcode = 0, message = "保存成功", versions = ReportVersions(reportName) }); } return Json(new { errcode = 1, message = "路径错误" }); } + private static string version_split = "=========版本说明============"; static System.Xml.XmlDocument Content2XmlDoc(string content) { var xmlDoc = new System.Xml.XmlDocument(); @@ -825,6 +885,8 @@ public IActionResult List(String loc_path = ".") //遍历文件夹 foreach (DirectoryInfo NextFolder in parent.GetDirectories()) { + if (NextFolder.Name == ".backup") + continue; ret.children.Add(new MyFileInfo(NextFolder.FullName) { FileName = NextFolder.Name, diff --git a/end/reportWeb/Controllers/PdfController.cs b/end/reportWeb/Controllers/PdfController.cs index 62e071b..7c0f9f6 100644 --- a/end/reportWeb/Controllers/PdfController.cs +++ b/end/reportWeb/Controllers/PdfController.cs @@ -88,7 +88,7 @@ public byte[] buildPdf(string report_str, PageSetup ps) int idx = 0; for (; idx < 1000; idx++) { - var cur_font = configuration["pdf_fonts" + ":" + idx] ; + var cur_font = configuration["pdf_fonts" + ":" + idx]; if (cur_font == null) break; FontProgram fontProgram = FontProgramFactory.CreateFont(cur_font); @@ -104,7 +104,7 @@ public byte[] buildPdf(string report_str, PageSetup ps) // fontProvider.AddFont(one); //} //String[] fonts = new string[] { "c:/windows/fonts/simfang.ttf" }; - + @@ -389,6 +389,7 @@ private Table addTable(ReportGridJSON rg, List row_list, List col_list } } pdf_cell.SetBorder(Border.NO_BORDER); + float cur_font_size = 0; foreach (var one_style in rg.find_style(rowNo, colNo)) { switch (one_style.Key) @@ -403,7 +404,8 @@ private Table addTable(ReportGridJSON rg, List row_list, List col_list //ret["font-family"] = one_pair[1]; break; case "FONT-SIZE": - pdf_cell.SetFontSize(float.Parse(one_style.Value)); + cur_font_size = float.Parse(one_style.Value); + pdf_cell.SetFontSize(cur_font_size); break; case "font-weight": pdf_cell.SetBold(); @@ -473,13 +475,15 @@ private Table addTable(ReportGridJSON rg, List row_list, List col_list int deta = 0; IBlockElement cur_pp = null; var cur_str = cell_value == null ? "" : cell_value.ToString(); + cur_str = (String.IsNullOrWhiteSpace(cur_str) ? " " : cur_str); + System.Web.HttpUtility.HtmlDecode(cur_str); if (cur_str.StartsWith("<")) { var t_str = cur_str.Replace("width:100%", $"width:{max_width}pt").Replace("height:100%", $"height:{max_height}pt"); - var t_list = HtmlConverter.ConvertToElements($"
{t_str}
", converterProperties); + var t_list = HtmlConverter.ConvertToElements($"
{t_str}
", converterProperties); if (t_list.Count == 1 && t_list[0] is IBlockElement) { - cur_pp = (t_list[0] as iText.Layout.Element.Div).SetFont(sysFont).SetFontSize(11); + cur_pp = (t_list[0] as iText.Layout.Element.Div).SetFont(sysFont).SetFontSize(cur_font_size); //(t_list[0] as iText.Layout.Element.Div).SetFontFamily(default_font).SetFontSize(11).GetRenderer(); //cur_pp.SetProperty(Property.AUTO_SCALE,) //cur_pp.SetProperty(Property.HEIGHT, max_height); @@ -497,6 +501,8 @@ private Table addTable(ReportGridJSON rg, List row_list, List col_list // pdf_cell.SetFontSize(new_font_size); } cur_pp = new Paragraph(cur_str); + if (cur_str == "ⓧ") + pdf_cell.SetFont(sysFont); } pdf_cell.Add(cur_pp) //replace_var_to_Paragraph(cell_value.ToString(),0,0)