diff --git a/end/CellReport.dll b/end/CellReport.dll index 9aa8332..646cac4 100644 Binary files a/end/CellReport.dll and b/end/CellReport.dll differ diff --git a/end/reportWeb/Controllers/DesignController.cs b/end/reportWeb/Controllers/DesignController.cs index 2546093..6f6709d 100644 --- a/end/reportWeb/Controllers/DesignController.cs +++ b/end/reportWeb/Controllers/DesignController.cs @@ -339,74 +339,58 @@ public IActionResult test_expr(String expr, int line, int column, string word) public async Task exec_expr(String expr, String report_content) { - Env report_env = null; - try - { - BaseExprFaced exprFaced; - - CellReport.dataSet.GroupMap cur_GroupMap = null; - - - if (String.IsNullOrEmpty(report_content)) - { - exprFaced = new ExprFaced2(); - exprFaced.addNewScopeForScript(); - report_env = new Env("exec_expr1"); - cur_GroupMap = new(); - exprFaced.addVariable("env", report_env); - exprFaced.addVariable("__env__", report_env); - exprFaced.addVariable("_user_", null); - exprFaced.addVariable("_zb_url_", configuration["zb_url"]); - exprFaced.addVariable("_zb_user_", rpt_group.zb_user); - exprFaced.addVariable("_zb_password_", rpt_group.zb_password); - exprFaced.addVariable("_zb_var_", new Dictionary()); - exprFaced.addVariable("_rpt_group_", rpt_group); - exprFaced.getVariableDefine("__page__").value = HttpContext.Request; - - } - else - { - System.Xml.XmlDocument xmlDoc = Content2XmlDoc(report_content); - string reportName = null; - if (reportName != null && reportName.Contains(":")) - reportName = reportName.Split(":")[1]; - using var reportDefine = await XmlReport.loadReportFromXmlDoc(xmlDoc, this.rpt_group.report_path, reportName ?? "temp.cr"); - report_env = reportDefine.getEnv(); - exprFaced = report_env.getExprFaced(); - exprFaced.getVariableDefine("__page__").value = HttpContext.Request; - exprFaced.addVariableForRoot("_page_size_", getFormValue("_page_size_")); - exprFaced.addVariableForRoot("_cur_page_num_", getFormValue("_cur_page_num_")); - cur_GroupMap = report_env.getDataSetResultMap(); - } + object exec_result = null; + if (String.IsNullOrEmpty(report_content)) + { + BaseExprFaced exprFaced = new ExprFaced2(); + exprFaced.addNewScopeForScript(); + using Env report_env = new Env("exec_expr1"); + CellReport.dataSet.GroupMap cur_GroupMap = new(); + exprFaced.addVariable("env", report_env); + exprFaced.addVariable("__env__", report_env); + exprFaced.addVariable("_user_", null); + exprFaced.addVariable("_zb_url_", configuration["zb_url"]); + exprFaced.addVariable("_zb_user_", rpt_group.zb_user); + exprFaced.addVariable("_zb_password_", rpt_group.zb_password); + exprFaced.addVariable("_zb_var_", new Dictionary()); + exprFaced.addVariable("_rpt_group_", rpt_group); + exprFaced.getVariableDefine("__page__").value = HttpContext.Request; report_env.logger = logger; foreach (var one in this.rpt_group.db_connection_list) { report_env.addDataSource(one.name, one.conn_str, one.db_type, "0", one.sql_prefix, one.sql_suffix); } - - var exec_result = exprFaced.calculate("{ " + expr + "\n}", cur_GroupMap, "当前脚本"); + exec_result = exprFaced.calculate("{ " + expr + "\n}", cur_GroupMap, "当前脚本"); if (exec_result is Exception ex) { throw ex; } - return Json(new { errcode = 0, message = "", result = exec_result }, json_option); } - catch (Exception ex) + else { - StringBuilder sb_err = new(); - sb_err.AppendLine(ex.Message); - while (ex.InnerException != null) + System.Xml.XmlDocument xmlDoc = Content2XmlDoc(report_content); + string reportName = null; + if (reportName != null && reportName.Contains(":")) + reportName = reportName.Split(":")[1]; + using var reportDefine = await XmlReport.loadReportFromXmlDoc(xmlDoc, this.rpt_group.report_path, reportName ?? "temp.cr"); + using Env report_env = reportDefine.getEnv(); + BaseExprFaced exprFaced = report_env.getExprFaced(); + exprFaced.getVariableDefine("__page__").value = HttpContext.Request; + exprFaced.addVariableForRoot("_page_size_", getFormValue("_page_size_")); + exprFaced.addVariableForRoot("_cur_page_num_", getFormValue("_cur_page_num_")); + CellReport.dataSet.GroupMap cur_GroupMap = report_env.getDataSetResultMap(); + report_env.logger = logger; + foreach (var one in this.rpt_group.db_connection_list) { - ex = ex.InnerException; - sb_err.AppendLine(ex.Message); + report_env.addDataSource(one.name, one.conn_str, one.db_type, "0", one.sql_prefix, one.sql_suffix); + } + exec_result = exprFaced.calculate("{ " + expr + "\n}", cur_GroupMap, "当前脚本"); + if (exec_result is Exception ex) + { + throw ex; } - return Json(new { errcode = 1, message = sb_err.ToString() }, json_option); - } - finally - { - if (report_env != null) - report_env.Dispose(); } + return Json(new { errcode = 0, message = "", result = exec_result }, json_option); } public IActionResult exec_cmd(String cmd, string from, string to) { @@ -677,7 +661,7 @@ 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 cur_version, IFormFile imgFile, string desc) + public async Task Save(String reportName, String content, IFormFile imgFile, String cur_version, String last_version, string desc) { if (reportName.StartsWith("/")) reportName = reportName.Substring(1); @@ -685,60 +669,59 @@ public async Task Save(String reportName, String content, String 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); - if (!Directory.Exists(fileInfo.DirectoryName)) - Directory.CreateDirectory(fileInfo.DirectoryName); - if (imgFile != null) - { - using (var stream = System.IO.File.Create(file_path + ".jpg")) - { - await imgFile.CopyToAsync(stream); - } - return Json(new { errcode = 0, message = "保存图片成功" }); ; - } - 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 }); - } - XmlReport.MemoryCacheInstance.Remove(file_path); - return Json(new { errcode = 0, message = "保存成功", versions = ReportVersions(reportName) }); - } - return Json(new { errcode = 1, message = "路径错误" }); - + if (!file_path.StartsWith(this.rpt_group.report_path)) + return Json(new { errcode = 1, message = "路径错误" }); + var fileInfo = new FileInfo(file_path); + var LastWriteTime = fileInfo.LastWriteTime.ToString("yyyy-MM-dd HH:mm:ss"); + if (fileInfo.Exists && last_version != LastWriteTime) + return Json(new { errcode = 1, message = "报表已被更改,请重载后重试!" }); + + if (!Directory.Exists(fileInfo.DirectoryName)) + Directory.CreateDirectory(fileInfo.DirectoryName); + if (imgFile != null) + { + using (var stream = System.IO.File.Create(file_path + ".jpg")) + { + await imgFile.CopyToAsync(stream); + } + return Json(new { errcode = 0, message = "保存图片成功" }); + } + var now_time = DateTime.Now; + var all_versions = ReportVersions(reportName); + 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 && last_version != 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 }); + } + XmlReport.MemoryCacheInstance.Remove(file_path); + return Json(new { errcode = 0, message = "保存成功", versions = ReportVersions(reportName) }); } private static string version_split = "=========版本说明============"; static System.Xml.XmlDocument Content2XmlDoc(string content) diff --git a/end/reportWeb/Pages/ReportModel.cs b/end/reportWeb/Pages/ReportModel.cs index 98eaa44..7b87e67 100644 --- a/end/reportWeb/Pages/ReportModel.cs +++ b/end/reportWeb/Pages/ReportModel.cs @@ -186,7 +186,7 @@ public async Task Page_Load() //Console.WriteLine("before_exec:" + (DateTime.Now - start_time) / 10000 + "秒"); if (false == pre_page_load()) return; - if (exprFaced.hasVariable("before_exec")) + if (report_name != "/" && exprFaced.hasVariable("before_exec")) { before_exec_result =exprFaced.calculate("=before_exec()", report_env.getDataSetResultMap()) as CR_Object; if (before_exec_result != null) diff --git a/end/reportWeb/appsettings.json b/end/reportWeb/appsettings.json index 1fd79fb..8fa29c1 100644 --- a/end/reportWeb/appsettings.json +++ b/end/reportWeb/appsettings.json @@ -1,44 +1,45 @@ { - "Serilog": { - "Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File", "Serilog.Expressions" ], - "MinimumLevel": { - "Default": "Information", - "Override": { - "reportWeb": "Information", - "Microsoft.Hosting.Lifetime": "Information", - "Microsoft": "Warning", - "System": "Warning" + "Serilog": { + "Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File", "Serilog.Expressions" ], + "MinimumLevel": { + "Default": "Information", + "Override": { + "reportWeb": "Information", + "Microsoft.Hosting.Lifetime": "Information", + "Microsoft": "Warning", + "System": "Warning" - } - }, - "WriteTo": [ - { "Name": "Console" }, //,{"Name": "File", "Args": { "path": "Logs/log.txt" } } - { - "Name": "File", - "Args": { - "path": "Logs/error.txt", - "rollingInterval": "Day", - "RestrictedToMinimumLevel": "Warning", - "outputTemplate": "{Timestamp:HH:mm:ss.fff} [{Level}] {Message} {NewLine}" - } - } - ] + } }, - "aes_key": "ONxYDyNaCoyTzsp83JoQ3YYuMPHxk3j7", - "AllowedHosts": "*", - "cache_prefix": "report5", - "Jwt": { - "Issuer": "issuer", - "Audience": "audience", - "SigningKey": "c0d32c63-z43d-4917-bbc2-5e726d087452", - "Expires": 10080, - "ValidateLifetime": true - }, - //"redis_str": "127.0.0.1:6379,password=", - "zb_url": "", - "admin_user": "admin", - "admin_password": "database!123", - //"static_path": "", + "WriteTo": [ + { "Name": "Console" }, //,{"Name": "File", "Args": { "path": "Logs/log.txt" } } + { + "Name": "File", + "Args": { + "path": "Logs/error.txt", + "rollingInterval": "Day", + "RestrictedToMinimumLevel": "Warning", + "outputTemplate": "{Timestamp:HH:mm:ss.fff} [{Level}] {Message} {NewLine}" + } + } + ] + }, + "aes_key": "ONxYDyNaCoyTzsp83JoQ3YYuMPHxk3j7", + "AllowedHosts": "*", + "cache_prefix": "report5", + "Jwt": { + "Issuer": "issuer", + "Audience": "audience", + "SigningKey": "c0d32c63-z43d-4917-bbc2-5e726d087452", + "Expires": 10080, + "ValidateLifetime": true + }, + //"redis_str": "127.0.0.1:6379,password=", + "zb_url": "", + "admin_user": "admin", + "admin_password": "database!123", + "auto_save_interval_day": 1.0, + //"static_path": "", "DbProviderFactories": [ { "name": "SqlClient", @@ -52,7 +53,7 @@ "dllName": "Oracle.ManagedDataAccess", "FactoryClass": "Oracle.ManagedDataAccess.Client.OracleClientFactory", "InstanceName": "Instance", - "link_str": "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=ip地址)(PORT=端口))(CONNECT_DATA=(SERVER = SERVER名字)(SERVICE_NAME = 数据库)));User Id=用户;Password=口令;", + "link_str": "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=ip地址)(PORT=端口))(CONNECT_DATA=(SERVER = SERVER名字)(SERVICE_NAME = 数据库)));User Id=用户;Password=口令;" }, { "name": "Npgsql", @@ -74,7 +75,7 @@ "dllName": "System.Data.Odbc", "FactoryClass": "System.Data.Odbc.OdbcFactory", "InstanceName": "Instance", - "link_str":"Dsn=odbc数据源名称;" + "link_str": "Dsn=odbc数据源名称;" }, { "name": "DaMeng", diff --git a/end/reportWeb/reportWeb.csproj b/end/reportWeb/reportWeb.csproj index dec9449..44fc376 100644 --- a/end/reportWeb/reportWeb.csproj +++ b/end/reportWeb/reportWeb.csproj @@ -28,8 +28,8 @@ - - + + @@ -60,6 +60,12 @@ Always + + Always + + + Always + diff --git a/end/reportWeb/t_before_exec.js b/end/reportWeb/t_before_exec.js new file mode 100644 index 0000000..b9af515 --- /dev/null +++ b/end/reportWeb/t_before_exec.js @@ -0,0 +1,11 @@ +function download_img(url) { + var result = web_request({ 'url': url, 'raw': true }); + if (result.GetType().ToString().Contains("Exception")) + return { 'errcode': -1, 'message': result.Message }; + var content_type = result.response.Content.Headers['ContentType']['MediaType']; + if (content_type.StartsWith('image/')) + return { 'data': result.content, 'type': content_type }; + else + return { 'errcode': -1, 'message': "不是图片类型:" + content_type }; +} +return { download_img }; \ No newline at end of file diff --git a/end/reportWeb/t_crud.js b/end/reportWeb/t_crud.js new file mode 100644 index 0000000..7cbb489 --- /dev/null +++ b/end/reportWeb/t_crud.js @@ -0,0 +1,462 @@ +function AllDataSource() { + return getAllDataSourceName(); +} +function db_tables(datasource) { + return openDb(datasource).GetTables(); +} +function db_tableinfo(data) { + var db = openDb(data.datasource); + //trace("db.DbConnection.ConnectionString:", db.connection.ToString(), db.connection.ConnectionString); + //trace(db.connection.ConnectionString.split(";") + // .select(x=>{return x.split("=");}) + // .first(x=>{ return x[0]=='Data Source';})[1] + //); + var ret = db.GetTableInfo(data.table_name, data.schema_name); + ret.columns.forEach(x => { + if (x.auto_incr) { x['editDisabled'] = true; x.addDisabled = 'true'; } + if (!x.auto_incr && x.is_nullable == "NO") + x.rules = [{ required: true, message: "请输入" + x.label, trigger: "blur" }]; + if (x.data_type.ToLower() in ["date"]) { + x.type = 'date'; + x.format = 'yyyy-MM-dd'; + x.valueFormat = 'yyyy-MM-dd'; + } + if (x.data_type.ToLower() in ["time", "datetime"]) { + x.type = 'datetime'; + x.format = 'yyyy-MM-dd HH:mm:ss'; + x.valueFormat = 'yyyy-MM-dd HH:mm:ss'; + } + if (x.is_key == true) { + x.value = `_this.self.parent_obj?.${x.prop}`; + if (!x.auto_incr) { + x.editDisabled = `(_this.self.parent_obj?.${x.prop})!=null`; + x.addDisabled = `(_this.self.parent_obj?.${x.prop})!=null`; + } + } + if (x.data_type == "bit") { + x.type = 'switch'; + x.dicData = `[{label:'否',value:0},{label:'是',value:1}]`; + } + if (x.m_dictData) + x.dicData = `this.allDict["${x.m_dictData}"]`; + trace(x); + }); + return ret; +} +var schema_kind = { + "Microsoft.Data.SqlClient.SqlClientFactory": { + tables: `SELECT '' TABLE_CATALOG , S.name AS TABLE_SCHEMA, T.name AS TABLE_NAME FROM sys.tables AS T + INNER JOIN sys.schemas AS S ON T.schema_id = S.schema_id`, + foreign: [ + `SELECT S.name AS base_schema_name, T.name AS base_table_name, C.name AS base_column_name, + US.name AS unique_schema_name, UT.name AS unique_table_name, UC.name AS unique_column_name + FROM sys.tables AS T + INNER JOIN sys.schemas AS S ON T.schema_id = S.schema_id + INNER JOIN sys.foreign_keys AS FK ON T.object_id = FK.parent_object_id + INNER JOIN sys.foreign_key_columns AS FKC ON FK.object_id = FKC.constraint_object_id + INNER JOIN sys.columns AS C ON FKC.parent_object_id = C.object_id AND FKC.parent_column_id = C.column_id + INNER JOIN sys.columns AS UC ON FKC.referenced_object_id = UC.object_id AND FKC.referenced_column_id = UC.column_id + INNER JOIN sys.tables AS UT ON FKC.referenced_object_id = UT.object_id + INNER JOIN sys.schemas AS US ON UT.schema_id = US.schema_id + where T.name='$table$' + ORDER BY base_schema_name, base_table_name` , + `=cur.select(x=>{table:x.unique_table_name, from:x.base_column_name,to:x.unique_column_name})`], + columns: [` + with aaa as( SELECT column_name FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE + WHERE TABLE_NAME = '$table$' and Constraint_name=(SELECT OBJECT_NAME(OBJECT_ID) AS NameofConstraint FROM sys.objects + WHERE type_desc IN ('PRIMARY_KEY_CONSTRAINT') and OBJECT_NAME(parent_object_id) = '$table$') + ) + SELECT T.object_id,S.name AS schema_name, T.name AS table_name + , C.name AS column_name,C.is_nullable, C.is_rowguidcol,C.is_identity auto_incr,tp.NAME data_type, + case when exists (select 1 from aaa where column_name=c.name) then 1 else 0 end is_key + FROM sys.tables AS T + INNER JOIN sys.schemas AS S ON T.schema_id = S.schema_id + INNER JOIN sys.columns AS C ON T.object_id = C.OBJECT_ID + INNER JOIN sys.types AS tp ON C.user_type_id = tp.user_type_id + where T.name='$table$'`, + `=cur.select(x=>{prop:x.column_name, label:x.column_name,type:"input",auto_incr:iif(x.auto_incr==true || x.auto_incr==1,true,false), + is_nullable:iif(x.is_nullable==true || x.is_nullable==1,'YES','NO'),dflt_value:'',is_key:iif(x.is_key!=0,true,false), + data_type:x.data_type}).toList()` ], + + }, + "Microsoft.Data.Sqlite.SqliteFactory": { + tables: `SELECT '' TABLE_CATALOG ,'' TABLE_SCHEMA,tbl_name TABLE_NAME FROM "main".sqlite_master where type='table';`, + foreign: [`PRAGMA foreign_key_list('$table$')`, + `=cur.select(x=>{table:x.table, from:x.from,to:x.to})`], + columns: [` + SELECT *,case when pk=1 and EXISTS (SELECT 1 FROM "sqlite_sequence" where name='$table$') then 1 else 0 end auto_incr + FROM pragma_table_info('$table$')`, + `=cur.select(x=>{prop:x.name, label:x.name,type:"input",auto_incr:iif(x.auto_incr==1,true,false), + is_nullable:iif(x.notnull==1,'NO','YES'),dflt_value:x.dflt_value,is_key:iif(x.pk!=0,true,false), + data_type:x.type}).toList()`], + + }, + "Npgsql.NpgsqlFactory": { + tables: `select t.schemaname TABLE_SCHEMA,a.relname as TABLE_NAME , b.description as value from pg_class a + join pg_tables t on a.relname=t.tablename + left join (select * from pg_description where objsubid =0 ) b on a.oid = b.objoid + where t.tableowner = '$Username$' and t.schemaname!='cstore' + order by a.relname asc;`, + foreign: [`SELECT table_name, constraint_name,* + FROM information_schema.table_constraints + WHERE constraint_type = 'FOREIGN KEY' and table_name=''`, + `=cur.select(x=>{table:x.table, from:x.from,to:x.to})`], + columns: [` + select ordinal_position as Colorder,column_name as ColumnName,data_type as TypeName, + coalesce(character_maximum_length,numeric_precision,-1) as Length,numeric_scale as Scale, + case is_nullable when 'NO' then 0 else 1 end as CanNull,column_default as DefaultVal, + case when position('nextval' in column_default)>0 then 1 else 0 end as IsIdentity, + case when b.pk_name is null then 0 else 1 end as IsPK,c.DeText + from information_schema.columns + left join ( + select pg_attr.attname as colname,pg_constraint.conname as pk_name from pg_constraint + inner join pg_class on pg_constraint.conrelid = pg_class.oid + inner join pg_attribute pg_attr on pg_attr.attrelid = pg_class.oid and pg_attr.attnum = pg_constraint.conkey[1] + inner join pg_type on pg_type.oid = pg_attr.atttypid + where pg_class.relname = '$table$' and pg_constraint.contype='p' + ) b on b.colname = information_schema.columns.column_name + left join ( + select attname,description as DeText from pg_class + left join pg_attribute pg_attr on pg_attr.attrelid= pg_class.oid + left join pg_description pg_desc on pg_desc.objoid = pg_attr.attrelid and pg_desc.objsubid=pg_attr.attnum + where pg_attr.attnum>0 and pg_attr.attrelid=pg_class.oid and pg_class.relname='$table$' + )c on c.attname = information_schema.columns.column_name + where table_schema='$schema$' and table_name='$table$' order by ordinal_position asc`, + `=cur.select(x=>{prop:x.ColumnName, label:x.DeText??x.ColumnName,type:iif(x.TypeName=='text',"textarea","input"),auto_incr:iif(x.IsIdentity==1,true,false), + is_nullable:iif(x.CanNull==1,'NO','YES'),dflt_value:x.DefaultVal,is_key:iif(x.IsPK!=0,true,false), + data_type:x.TypeName}).toList()`], + + }, + "MySqlConnector.MySqlConnectorFactory": { + tables: `select '' TABLE_CATALOG, TABLE_SCHEMA, table_name AS TABLE_NAME from information_schema.tables where TABLE_TYPE!='SYSTEM TABLE' and TABLE_TYPE!='SYSTEM VIEW';`, + foreign: [ + `SELECT + O.TABLE_SCHEMA AS base_schema_name, + O.TABLE_NAME AS base_table_name, + O.COLUMN_NAME AS base_column_name, + O.REFERENCED_TABLE_SCHEMA AS unique_schema_name, + O.REFERENCED_TABLE_NAME AS unique_table_name, + O.REFERENCED_COLUMN_NAME AS unique_column_name + FROM + ( + SELECT + K.CONSTRAINT_SCHEMA, + K.CONSTRAINT_NAME, + K.TABLE_SCHEMA, + K.TABLE_NAME, + K.COLUMN_NAME, + K.REFERENCED_TABLE_SCHEMA, + K.REFERENCED_TABLE_NAME, + K.REFERENCED_COLUMN_NAME, + R.UPDATE_RULE, + R.DELETE_RULE, + R.UNIQUE_CONSTRAINT_NAME + FROM + (select * from information_schema.KEY_COLUMN_USAGE where TABLE_SCHEMA='$schema$' and TABLE_NAME='$table$') K + LEFT JOIN information_schema.REFERENTIAL_CONSTRAINTS R ON K.CONSTRAINT_NAME = R.CONSTRAINT_NAME + ) AS O + INNER JOIN Information_schema.TABLE_CONSTRAINTS T ON O.Table_Name = T.TABLE_NAME + AND T.CONSTRAINT_NAME = O.CONSTRAINT_NAME + AND T.CONSTRAINT_TYPE = 'FOREIGN KEY' + ORDER BY base_schema_name, base_table_name` , + `=cur.select(x=>{table:x.unique_table_name, from:x.base_column_name,to:x.unique_column_name})`], + columns: [` + select NULL AS object_id, A.TABLE_SCHEMA AS schema_name, A.TABLE_NAME as table_name, B.COLUMN_NAME as column_name, B.DATA_TYPE as data_type, + IF(B.IS_NULLABLE='NO', 0,1) AS is_nullable, 0 AS is_rowguidcol, IF(B.EXTRA='auto_increment', 1,0) AS auto_incr, + IF(B.COLUMN_KEY='PRI', 1,0) AS is_key, B.COLUMN_COMMENT as column_comment + from (SELECT * FROM information_schema.tables where TABLE_SCHEMA='$schema$' AND TABLE_NAME = '$table$') A + INNER JOIN information_schema.COLUMNS B ON A.TABLE_SCHEMA=B.TABLE_SCHEMA AND A.TABLE_NAME=B.TABLE_NAME + order by B.ORDINAL_POSITION`, + `=cur.select(x=>{prop:x.column_name, label:x.column_name,type:"input",auto_incr:iif(x.auto_incr==1,true,false), + is_nullable:iif(x.is_nullable==1,'YES','NO'),dflt_value:'',is_key:iif(x.is_key!=0,true,false), + data_type:x.data_type}).toList()` ], + auto_incr_sql: 'select @@IDENTITY as key;', + }, +}; + +var tbl_default_filter = `=cur.select(x=>{ + prop:x.ColumnName,label:x.ColumnName,type:'input', + is_nullable: iif(x.IsNull==1,'YES','') ,is_key:iif(x.IsKey==1,true,false), + data_type: x.ColumnType} )`; +var schema_filter = `=cur.orderBy(x=>x.ORDINAL_POSITION).select(x => { + prop: x.COLUMN_NAME,label: x.COLUMN_NAME,type: 'input', + is_nullable: x.IS_NULLABLE, + data_type: x.DATA_TYPE})`; + + +function buildTemplate(para) { + + var cur_schema = openDb(para.ds_link).schema_kind; + var col_list = para.col_list;//表的所有列名 + if (para.keys.count() == 0) + return { errcode: 1, message: `没有定义主键` }; + var key_not_exists = para.keys.Where(x => x not in col_list).JoinAsString(); + trace("key_not_exists:", key_not_exists); + if (key_not_exists != '') + return { errcode: 1, message: `${key_not_exists} 不在列表中!(${col_list.JoinAsString()})` }; + // crud + var crud_cloumns = col_list.Where(x => x in para.keys).select(x => `{label:"${x}",prop:"${x}",span:8,type:"input",editDisabled:true,addDisabled: 'false'}`) + .union(col_list.Where(x => x not in para.keys).select(x => `{label:"${x}",prop:"${x}",span:8,type:"input"}`)) + .JoinAsString(',\\n'); + var where_str = para.keys.select(x => `[${x}]='\${crud_obj.${x}\}'`).JoinAsString(" and "); + var list_where = iif(para.parent_table == null, " 1=1 `", para.parent_table.select(x => `${x.self_key}='\${p.${x.parent_key}}'`).joinAsString(' and ')); + //-------------------------------- + + var kata_template = ` + function 插入_${para.table}(p_obj){ + var col_list=[ ${col_list} ]; + var key_list=[${para.keys}]; + var auto_incr_cols=[${para.auto_incr_cols}]; + var insert_obj={}; + col_list.Except(auto_incr_cols).ForEach(x=>{insert_obj[x]=p_obj[x]; }); + var db=kata("${para.ds_link}"); + //这里需要按照具体数据库修改主键获取。缺省是按只有一个字段的自增主键。 + var 结果=db.Query('${para.schema + para.table}').InsertGetId(insert_obj); + + ${iif(para.auto_incr_cols.count() == 1, 'insert_obj.' + para.auto_incr_cols[0] + '=结果;', '//多主键,自己把握修改')} + return {errcode:0,result:insert_obj}; + } + function 修改_${para.table}(p_obj){ + var col_list=[ ${col_list} ]; + var key_list=[${para.keys}]; + col_list.Except(p_obj.new_val.Select(x=>x.key)).ForEach(x=>{p_obj.new_val[x]=null;});//补充缺失的字段 + var crud_obj=p_obj.new_val.Except(p_obj.old_val).Where(x=>x.key in col_list).ToDictionary($.key,$.value);//过滤掉相同值 + + if(crud_obj.select(x=>x.Key).count(x=>x in key_list) >0) + return {errcode:1,message:"新旧对象的主键不一致列表"}; + if(crud_obj.count()==0) + return {errcode:2,message:"没有需要更改的数据 "}; + + var key_cols={}; + key_list.forEach(x=> {key_cols[x]= p_obj.old_val[x];} );//主键条件 + + var db=kata("${para.ds_link}"); + var 结果=db.Query('${para.schema + para.table}').Where(key_cols).Update(crud_obj); + + return {errcode:0,结果,result:crud_obj}; + } + function 删除_${para.table}(crud_obj){ + var key_list=[${para.keys}]; + var key_cols={}; + key_list.forEach(x=> {key_cols[x]= crud_obj[x];} );//主键条件 + + var db=kata("${para.ds_link}"); + var 结果=db.Query('${para.schema + para.table}').Where(key_cols).Delete(); + return {errcode:0,结果}; + } + function 清单_${para.table}(p){ + var key_list= ${json_stringify(iif(para.parent_table == null, [], para.parent_table))}; + var db=kata("${para.ds_link}"); + var query=db.Query('${para.schema + para.table}'); + p.where?.ForEach(x=>{ + query=query.WhereLike(x.Key,'%'+x.Value+'%'); + }); + if(p.export_excel){ + var result=query.Get(); + return {data:result,total:result.Count}; + } + else + { + var result=query.Paginate(p.page.currentPage,p.page.pageSize); + return {data:result.List,total:result.Count}; + } + //return {data:query.List,total:query.Count}; + } + function TableData_${para.table}(p){ + var db=kata("${para.ds_link}"); + var result=db.Query(para.schema+p.table);// + if(p.value!=null) + return result.Where(p.key,'=',p.value).Get(); + if(p.data){ + p.data.forEach(x=> {result=result.WhereLike(x.key,'%'+$.Value+'%',true); } ); + } + if(p.page) + result=result.Paginate(p.page.currentPage,p.page.pageSize); + + return {total:result.Count,data:result.List}; + } + function 字典_${para.table}(){ + ${iif(para.allDict.count() > 0, 'var db=kata("' + para.ds_link + '");', '')} + ${para.allDict.select(x => + 'var ' + + x.table + + '=db.Query("' + para.schema + x.table + '").Get().select(x=>{return {value:x.' + + x.key + + ',label:\`' + + x.columns.select('\${x.' + $ + '\}').JoinAsString('_') + + '\`\};\});' + ).JoinAsString('\n ') + } + return {${para.allDict.select(x => x.table).JoinAsString(',')} }; + } + + `; + var 最终模板 = ` + + + + `; + return { 最终模板 }; +} + + +return { AllDataSource, db_tables, db_tableinfo, schema_kind, tbl_default_filter, schema_filter, buildTemplate }; \ No newline at end of file diff --git a/end/reportWeb/template.xml b/end/reportWeb/template.xml index 02fc15f..28320d0 100644 --- a/end/reportWeb/template.xml +++ b/end/reportWeb/template.xml @@ -30,59 +30,10 @@ firstNoQuery,excel_img_func,cr_front_validate,cr_auto_line_height,convert_col_to_button,BACKGROUND-COLOR,COLOR,FONT,FONT-SIZE,border_box,layout_mode,show_form,layout_row_height,layout_colNum,layout_margin,layout_pan_height,row_col_gutter,backgroundImage,big_screen,screen_width,screen_height 500000 - - - -window.cellreport.show_tips=true; +//window.cellreport.show_tips=true; window.luckysheet_conditionformat=[ {column_match:".*(占比|率)\$" ,val:'{"type":"colorGradation","cellrange":[{ "row":[0,1],"column":[1,1] }],"format":["rgb(248, 105, 107)", "rgb(255, 235, 132)", "rgb(99, 190, 123)"] }' }, //{column_match:".*(累计)" ,val:'{"type":"dataBar","cellrange":[{"left":283,"width":88,"top":117,"height":25,"left_move":283,"width_move":88,"top_move":117,"height_move":25,"row":[4,4],"column":[3,3],"row_focus":4,"column_focus":3}],"format":["red","#ffffff"]}' }, @@ -104,521 +55,52 @@ window.luckysheet_alternateformat_save={"cellrange":{"row":[0,8],"column":[-1,-1 |%|\""\""|,|>=|=<|<>|;|\|\||\[|\]|&|/|@)|(\b)+(select|update|insert|delete|declare|exec|dbcc|alter|drop|create|backup|if|else|end|and|or|add|set|open|close|use|begin|retun|as|go|exists)(\b)+)]]> - - - - - - - - - - - - - - - $gridHeaderTable_frozen$ - $gridHeaderTable$ - - -]]> - - - --> -$}$ - - $gridHeaderTable_frozen$ - $gridHeaderTable$ -
- -]]> -
+ + + {return x.split("=");}) - // .first(x=>{ return x[0]=='Data Source';})[1] - //); - var ret= db.GetTableInfo(data.table_name); - ret.columns.forEach(x=>{ - if(x.auto_incr) {x['editDisabled']=true ;x.addDisabled='true';} - if(!x.auto_incr && x.is_nullable=="NO") - x.rules=[{required: true,message: "请输入"+x.label,trigger: "blur"}]; - if(x.data_type.ToLower() in ["date"]) { - x.type='date'; - x.format='yyyy-MM-dd'; - x.valueFormat='yyyy-MM-dd'; - } - if(x.data_type.ToLower() in ["time","datetime"]) { - x.type='datetime'; - x.format='yyyy-MM-dd HH:mm:ss'; - x.valueFormat='yyyy-MM-dd HH:mm:ss'; - } - if(x.is_key==true) { - x.value=`_this.self.parent_obj?.${x.prop}`; - if(!x.auto_incr){ - x.editDisabled=`(_this.self.parent_obj?.${x.prop})!=null`; - x.addDisabled=`(_this.self.parent_obj?.${x.prop})!=null`; - } - } - if(x.data_type=="bit"){ - x.type='switch'; - x.dicData=`[{label:'否',value:0},{label:'是',value:1}]`; - } - if(x.m_dictData) - x.dicData=`this.allDict["${x.m_dictData}"]`; - trace(x); - }); - return ret; -} -var schema_kind={ - "Microsoft.Data.SqlClient.SqlClientFactory":{ - tables:`SELECT '' TABLE_CATALOG , S.name AS TABLE_SCHEMA, T.name AS TABLE_NAME FROM sys.tables AS T - INNER JOIN sys.schemas AS S ON T.schema_id = S.schema_id`, - foreign:[ - `SELECT S.name AS base_schema_name, T.name AS base_table_name, C.name AS base_column_name, - US.name AS unique_schema_name, UT.name AS unique_table_name, UC.name AS unique_column_name - FROM sys.tables AS T - INNER JOIN sys.schemas AS S ON T.schema_id = S.schema_id - INNER JOIN sys.foreign_keys AS FK ON T.object_id = FK.parent_object_id - INNER JOIN sys.foreign_key_columns AS FKC ON FK.object_id = FKC.constraint_object_id - INNER JOIN sys.columns AS C ON FKC.parent_object_id = C.object_id AND FKC.parent_column_id = C.column_id - INNER JOIN sys.columns AS UC ON FKC.referenced_object_id = UC.object_id AND FKC.referenced_column_id = UC.column_id - INNER JOIN sys.tables AS UT ON FKC.referenced_object_id = UT.object_id - INNER JOIN sys.schemas AS US ON UT.schema_id = US.schema_id - where T.name='$table$' - ORDER BY base_schema_name, base_table_name` , - `=cur.select(x=>{table:x.unique_table_name, from:x.base_column_name,to:x.unique_column_name})`] , - columns:[` - with aaa as( SELECT column_name FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE - WHERE TABLE_NAME = '$table$' and Constraint_name=(SELECT OBJECT_NAME(OBJECT_ID) AS NameofConstraint FROM sys.objects - WHERE type_desc IN ('PRIMARY_KEY_CONSTRAINT') and OBJECT_NAME(parent_object_id) = '$table$') - ) - SELECT T.object_id,S.name AS schema_name, T.name AS table_name - , C.name AS column_name,C.is_nullable, C.is_rowguidcol,C.is_identity auto_incr,tp.NAME data_type, - case when exists (select 1 from aaa where column_name=c.name) then 1 else 0 end is_key - FROM sys.tables AS T - INNER JOIN sys.schemas AS S ON T.schema_id = S.schema_id - INNER JOIN sys.columns AS C ON T.object_id = C.OBJECT_ID - INNER JOIN sys.types AS tp ON C.user_type_id = tp.user_type_id - where T.name='$table$'`, - `=cur.select(x=>{prop:x.column_name, label:x.column_name,type:"input",auto_incr:iif(x.auto_incr==true || x.auto_incr==1,true,false), - is_nullable:iif(x.is_nullable==true || x.is_nullable==1,'YES','NO'),dflt_value:'',is_key:iif(x.is_key!=0,true,false), - data_type:x.data_type}).toList()` ], - - }, - "Microsoft.Data.Sqlite.SqliteFactory":{ - tables:`SELECT '' TABLE_CATALOG ,'' TABLE_SCHEMA,tbl_name TABLE_NAME FROM "main".sqlite_master where type='table';`, - foreign:[`PRAGMA foreign_key_list('$table$')`, - `=cur.select(x=>{table:x.table, from:x.from,to:x.to})`], - columns:[` - SELECT *,case when pk=1 and EXISTS (SELECT 1 FROM "sqlite_sequence" where name='$table$') then 1 else 0 end auto_incr - FROM pragma_table_info('$table$')`, - `=cur.select(x=>{prop:x.name, label:x.name,type:"input",auto_incr:iif(x.auto_incr==1,true,false), - is_nullable:iif(x.notnull==1,'NO','YES'),dflt_value:x.dflt_value,is_key:iif(x.pk!=0,true,false), - data_type:x.type}).toList()`], - - }, - "MySqlConnector.MySqlConnectorFactory":{ - tables:`select '' TABLE_CATALOG, TABLE_SCHEMA, table_name AS TABLE_NAME from information_schema.tables where table_schema='$Database$';`, - foreign:[ - `SELECT - O.TABLE_SCHEMA AS base_schema_name, - O.TABLE_NAME AS base_table_name, - O.COLUMN_NAME AS base_column_name, - O.REFERENCED_TABLE_SCHEMA AS unique_schema_name, - O.REFERENCED_TABLE_NAME AS unique_table_name, - O.REFERENCED_COLUMN_NAME AS unique_column_name - FROM - ( - SELECT - K.CONSTRAINT_SCHEMA, - K.CONSTRAINT_NAME, - K.TABLE_SCHEMA, - K.TABLE_NAME, - K.COLUMN_NAME, - K.REFERENCED_TABLE_SCHEMA, - K.REFERENCED_TABLE_NAME, - K.REFERENCED_COLUMN_NAME, - R.UPDATE_RULE, - R.DELETE_RULE, - R.UNIQUE_CONSTRAINT_NAME - FROM - (select * from information_schema.KEY_COLUMN_USAGE where TABLE_SCHEMA='$Database$' and TABLE_NAME='$table$') K - LEFT JOIN information_schema.REFERENTIAL_CONSTRAINTS R ON K.CONSTRAINT_NAME = R.CONSTRAINT_NAME - ) AS O - INNER JOIN Information_schema.TABLE_CONSTRAINTS T ON O.Table_Name = T.TABLE_NAME - AND T.CONSTRAINT_NAME = O.CONSTRAINT_NAME - AND T.CONSTRAINT_TYPE = 'FOREIGN KEY' - ORDER BY base_schema_name, base_table_name` , - `=cur.select(x=>{table:x.unique_table_name, from:x.base_column_name,to:x.unique_column_name})`] , - columns:[` - select NULL AS object_id, A.TABLE_SCHEMA AS schema_name, A.TABLE_NAME as table_name, B.COLUMN_NAME as column_name, B.DATA_TYPE as data_type, - IF(B.IS_NULLABLE='NO', 0,1) AS is_nullable, 0 AS is_rowguidcol, IF(B.EXTRA='auto_increment', 1,0) AS auto_incr, - IF(B.COLUMN_KEY='PRI', 1,0) AS is_key, B.COLUMN_COMMENT as column_comment - from (SELECT * FROM information_schema.tables where TABLE_SCHEMA='$Database$' AND TABLE_NAME = '$table$') A - INNER JOIN information_schema.COLUMNS B ON A.TABLE_SCHEMA=B.TABLE_SCHEMA AND A.TABLE_NAME=B.TABLE_NAME - order by B.ORDINAL_POSITION`, - `=cur.select(x=>{prop:x.column_name, label:x.column_name,type:"input",auto_incr:iif(x.auto_incr==1,true,false), - is_nullable:iif(x.is_nullable==1,'YES','NO'),dflt_value:'',is_key:iif(x.is_key!=0,true,false), - data_type:x.data_type}).toList()` ], - auto_incr_sql:'select @@IDENTITY as key;', - }, -} ; - -var tbl_default_filter=`=cur.select(x=>{ - prop:x.ColumnName,label:x.ColumnName,type:'input', - is_nullable: iif(x.IsNull==1,'YES','') ,is_key:iif(x.IsKey==1,true,false), - data_type: x.ColumnType} )`; -var schema_filter=`=cur.orderBy(x=>x.ORDINAL_POSITION).select(x => { - prop: x.COLUMN_NAME,label: x.COLUMN_NAME,type: 'input', - is_nullable: x.IS_NULLABLE, - data_type: x.DATA_TYPE})`; - - -function buildTemplate(para){ - - var cur_schema=openDb(para.ds_link).schema_kind; - var col_list=para.col_list;//表的所有列名 - if(para.keys.count()==0) - return {errcode:1,message:`没有定义主键`}; - var key_not_exists=para.keys.Where(x=> x not in col_list).JoinAsString(); - trace("key_not_exists:",key_not_exists); - if(key_not_exists!='') - return {errcode:1,message:`${key_not_exists} 不在列表中!(${col_list.JoinAsString()})`}; - // crud - var crud_cloumns=col_list.Where(x=>x in para.keys).select(x => `{label:"${x}",prop:"${x}",span:8,type:"input",editDisabled:true,addDisabled: 'false'}`) - .union( col_list.Where(x=>x not in para.keys).select(x => `{label:"${x}",prop:"${x}",span:8,type:"input"}`) ) - .JoinAsString(',\\n'); - var where_str=para.keys.select(x => `[${x}]='\${crud_obj.${x}\}'`).JoinAsString(" and ") ; - var list_where=iif(para.parent_table==null," 1=1 `",para.parent_table.select(x=>`${x.self_key}='\${p.${x.parent_key}}'` ).joinAsString(' and ') ); - //-------------------------------- - - var kata_template=` -function 插入_${para.table}(p_obj){ - var col_list=[ ${col_list} ]; - var key_list=[${para.keys}]; - var auto_incr_cols=[${para.auto_incr_cols}]; - var insert_obj={}; - col_list.Except(auto_incr_cols).ForEach(x=>{insert_obj[x]=p_obj[x]; }); - var db=kata("${para.ds_link}"); - //这里需要按照具体数据库修改主键获取。缺省是按只有一个字段的自增主键。 - var 结果=db.Query('${para.table}').InsertGetId(insert_obj); - - ${ iif(para.auto_incr_cols.count()==1,'insert_obj.'+para.auto_incr_cols[0]+'=结果;','//多主键,自己把握修改') } - return {errcode:0,result:insert_obj}; -} -function 修改_${para.table}(p_obj){ - var col_list=[ ${col_list} ]; - var key_list=[${para.keys}]; - col_list.Except(p_obj.new_val.Select(x=>x.key)).ForEach(x=>{p_obj.new_val[x]=null;});//补充缺失的字段 - var crud_obj=p_obj.new_val.Except(p_obj.old_val).Where(x=>x.key in col_list).ToDictionary($.key,$.value);//过滤掉相同值 - - if(crud_obj.select(x=>x.Key).count(x=>x in key_list) >0) - return {errcode:1,message:"新旧对象的主键不一致列表"}; - if(crud_obj.count()==0) - return {errcode:2,message:"没有需要更改的数据 "}; - - var key_cols={}; - key_list.forEach(x=> {key_cols[x]= p_obj.old_val[x];} );//主键条件 - - var db=kata("${para.ds_link}"); - var 结果=db.Query('${para.table}').Where(key_cols).Update(crud_obj); - - return {errcode:0,结果,result:crud_obj}; -} -function 删除_${para.table}(crud_obj){ - var key_list=[${para.keys}]; - var key_cols={}; - key_list.forEach(x=> {key_cols[x]= crud_obj[x];} );//主键条件 - - var db=kata("${para.ds_link}"); - var 结果=db.Query('${para.table}').Where(key_cols).Delete(); - return {errcode:0,结果}; -} -function 清单_${para.table}(p){ - var key_list= ${json_stringify(iif(para.parent_table==null,[],para.parent_table)) }; - var db=kata("${para.ds_link}"); - var ret=db.Query('${para.table}').Where(p.where||{}); - if(p.export_excel){ - var result=ret.Get(); - return {data:result,total:result.Count}; - } - else - { - var result=ret.Paginate(p.page.currentPage,p.page.pageSize); - return {data:result.List,total:result.Count}; - } - return {data:ret.List,total:ret.Count}; -} -function TableData_${para.table}(p){ - var db=kata("${para.ds_link}"); - var result=db.Query(p.table);// - if(p.value!=null) - return result.Where(p.key,'=',p.value).Get(); - if(p.data){ - p.data.forEach(x=> {result=result.WhereLike(x.key,'%'+$.Value+'%',true); } ); - } - if(p.page) - result=result.Paginate(p.page.currentPage,p.page.pageSize); - - return {total:result.Count,data:result.List}; -} -function 字典_${para.table}(){ - ${iif(para.allDict.count()>0,'var db=kata("'+para.ds_link+'");','')} - ${para.allDict.select(x=> - 'var ' - +x.table - +'=db.Query("'+x.table+'").Get().select(x=>{return {value:x.' - +x.key - +',label:\`' - + x.columns.select('\${x.'+$+'\}').JoinAsString('_') - +'\`\};\});' - ).JoinAsString('\n ') - } - return {${para.allDict.select(x=>x.table).JoinAsString(',')} }; -} - - `; - var 最终模板=` - - - - `; - return {最终模板}; - } -]]> - - +}; + ]]> + diff --git a/front/src/views/rpt_design/api/report_api.js b/front/src/views/rpt_design/api/report_api.js index 6713e9a..53e8c5f 100644 --- a/front/src/views/rpt_design/api/report_api.js +++ b/front/src/views/rpt_design/api/report_api.js @@ -91,12 +91,12 @@ export function grid_range_level(report) { } export function report_as_text(report) { - - - report.dataSets?.dataSet?.forEach(x=> - {if(x.__text) - x.__text=x.__text.replaceAll("\r","") - }) + if(report.dataSets?.dataSet){ + report.dataSets.dataSet.forEach(x=> + {if(x.__text && typeof x.__text=="string") + x.__text=x.__text.replaceAll("\r","") + }) + } let temp={ conn_list:report.conn_list, range_level:report.range_level, @@ -109,6 +109,7 @@ export function report_as_text(report) { delete report.parent_defaultsetting delete report.versions delete report.cur_version + delete report.datasources let ret=x2jsone.js2xml({report}) report.conn_list=temp.conn_list report.range_level=temp.range_level @@ -127,6 +128,7 @@ export function save_one(report,imgFile,desc) { data.append('reportName',reportFilePath) data.append('content',txt) data.append('cur_version',report.cur_version??"") + data.append('last_version',report.versions?report.versions[0][0]:"") data.append('desc',desc??"") if(imgFile) data.append('imgFile', imgFile) diff --git a/front/src/views/rpt_design/crud_template.vue b/front/src/views/rpt_design/crud_template.vue index 0ee0298..47214ad 100644 --- a/front/src/views/rpt_design/crud_template.vue +++ b/front/src/views/rpt_design/crud_template.vue @@ -20,7 +20,7 @@ - + @@ -346,12 +346,12 @@ export default { async table_change(val){ let tbl=val.split(".") this.all_tbl={} - let main_tbl=await call_server_func(`db_tableinfo`,{datasource:this.data.datasource,table_name:tbl[2]},this.server_url) + let main_tbl=await call_server_func(`db_tableinfo`,{datasource:this.data.datasource,table_name:tbl[2],schema_name:tbl[1]},this.server_url) this.all_tbl[tbl[2]]=main_tbl for(let x in main_tbl.foreign_info) { let cur=main_tbl.foreign_info[x] - let one=await call_server_func(`db_tableinfo`,{datasource:this.data.datasource,table_name:cur.table},this.server_url) + let one=await call_server_func(`db_tableinfo`,{datasource:this.data.datasource,table_name:cur.table,schema_name:tbl[1]},this.server_url) this.all_tbl[cur.table]=one } Object.keys(this.all_tbl).forEach(a=>{ @@ -411,6 +411,7 @@ export default { call_server_func(`buildTemplate` , { ds_link:this.data.datasource, + schema:this.data.table.split(".")[1]==""?"":this.data.table.split(".")[1]+".", table:this.data.table.split(".")[2], col_list:Enumerable.from(this.cloumn_list).select(x=>x.prop).toArray(), keys:Enumerable.from(this.cloumn_list).where(x=>x.is_key==true).select(x=>x.prop).toArray(), diff --git a/front/src/views/rpt_design/datasetManger2.vue b/front/src/views/rpt_design/datasetManger2.vue index 695315d..be95163 100644 --- a/front/src/views/rpt_design/datasetManger2.vue +++ b/front/src/views/rpt_design/datasetManger2.vue @@ -599,8 +599,7 @@ export default { _this.action_target._dataSource="memory" } if(command=="api"){ - _this.action_target.__text=`from_zb( { "url":"报表地址"} ); - + _this.action_target.__text=` web_request({ 'url':"API网址" //用你的地址替换这里 ,'method':'post' //可用方法: get ,post @@ -608,10 +607,6 @@ web_request({ ,'json':null //使用json提交,json 和data 不能同时有值,至少有一个是null ,'headers':null });// 语句必须以逗号结束 - -innerReport(); //设计好的报表页面选中有关单元格,复制粘贴到小括号里面 - -//以上三选一,不用的请手工删掉 ` } _this.all_dataSet.push(_this.action_target ) diff --git a/front/src/views/rpt_design/design_index.vue b/front/src/views/rpt_design/design_index.vue index 7b9f6ec..2cece29 100644 --- a/front/src/views/rpt_design/design_index.vue +++ b/front/src/views/rpt_design/design_index.vue @@ -214,7 +214,7 @@ if(window.cr_allWidget==undefined){ window.cr_allWidget=data }); } - +window.cellreport.tool=require("./utils/util") export default { name: "FormDesign", mixins: [history], @@ -1142,7 +1142,7 @@ export default { _this.save_fix() if(save_type=='download'){ let txt=report_as_text(_this.report)//.replace(/&/g, '&').replace(/</g,'<').replace(/>/g,'>').replace(/ /g,' ').replace(/'/g,'\'').replace(/"/g,'\"'); - saveAs(new Blob([txt], { type: "application/octet-stream"}), "这里是下载的文件.cr"); + saveAs(new Blob([txt], { type: "application/octet-stream"}),this.report.reportName.split(":")[1].split("/").slice(-1)); return; } if(save_type!='force' && this.cur_version!=this.report.versions[0][0]){ diff --git a/front/src/views/rpt_design/element/luckySheetProxy.vue b/front/src/views/rpt_design/element/luckySheetProxy.vue index 71d746a..11ba8a6 100644 --- a/front/src/views/rpt_design/element/luckySheetProxy.vue +++ b/front/src/views/rpt_design/element/luckySheetProxy.vue @@ -213,7 +213,7 @@ export default { { _this.self_page_size=_this.cur_result.tableData.length if(_this.cur_result.row_page_break_set.length>0) - _this.page_count=_this.cur_result.row_page_break_set.length + _this.page_count=_this.cur_result.row_page_break_set.length+1 }else{ _this.self_page_size=_this.self.page_size } diff --git a/front/src/views/rpt_design/list.vue b/front/src/views/rpt_design/list.vue index 013963a..0489008 100644 --- a/front/src/views/rpt_design/list.vue +++ b/front/src/views/rpt_design/list.vue @@ -364,7 +364,7 @@ export default { "screen_width": "1920", "screen_height": "1080" } - }) + }).catch(err=>this.$alert(err)); } else{ save_one({reportName:reportName, @@ -374,7 +374,7 @@ export default { rows:{row:Enumerable.range(1,10).select(x=> {return {_name:x,_height:25,_fixed:"True"}}).toArray()}, columns:{column:Enumerable.range(0,10).select(x=> {return {_name:'abcdefghijklmn'[x],_width:75,_fixed:"False"}}).toArray()} }]} - }) + }).catch(err=>this.$alert(err)); } //this.cur_grp.loc_path.push(row.FileName) rptList(this.grp_id,this.cur_grp.loc_path.join("/")).then(response_data => { diff --git a/front/src/views/rpt_design/preview.vue b/front/src/views/rpt_design/preview.vue index 66e1c8b..c6ae345 100644 --- a/front/src/views/rpt_design/preview.vue +++ b/front/src/views/rpt_design/preview.vue @@ -162,7 +162,7 @@