using Ewide.Core; using Furion.DependencyInjection; using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Localization; using Newtonsoft.Json.Linq; using RoadFlow.Utility; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace RoadFlow.Data { public class Program: RoadFlowRepository,IProgram, ITransient { /// /// 得到运行时实体 /// /// /// 语言包 /// public Model.ProgramRun GetRunModel(string id, IStringLocalizer localizer = null) { string key = "ProgramRun_" + id; var obj = _memoryCache.Get(key); if (obj != null) { return (Model.ProgramRun)obj; } else { var programModel = GetOneById(id); if (null == programModel) { return null; } Model.ProgramRun programRunModel = new Model.ProgramRun { ButtonLocation = programModel.ButtonLocation, ClientScript = programModel.ClientScript, ConnId = programModel.ConnId.ToGuid(), CreateTime = programModel.CreateTime, CreateUserId = programModel.CreateUserId.ToGuid(), EditModel = programModel.EditModel, ExportFileName = programModel.ExportFileName, ExportHeaderText = programModel.ExportHeaderText, ExportTemplate = programModel.ExportTemplate, FormId = programModel.FormId, Height = programModel.Height, Id = programModel.Id.ToGuid(), InDataNumberFiledName = programModel.InDataNumberFiledName, IsAdd = programModel.IsAdd, IsPager = programModel.IsPager, RowNumber = programModel.RowNumber, Name = programModel.Name, ProgramButtons = new ProgramButton().GetAllByProgramId(programModel.Id), ProgramExports = new ProgramExport().GetAllByProgramId(programModel.Id), ProgramFields = new ProgramField().GetAllByProgramId(programModel.Id), ProgramQueries = new ProgramQuery().GetAllByProgramId(programModel.Id), ProgramValidates = new ProgramValidate().GetAllByProgramId(programModel.Id), PublishTime = programModel.PublishTime, SelectColumn = programModel.SelectColumn, SqlString = programModel.SqlString, Status = programModel.Status, TableHead = programModel.TableHead, TableStyle = programModel.TableStyle, Type = programModel.Type.ToGuid(), Width = programModel.Width, GroupHeaders = programModel.GroupHeaders, DefaultSort = programModel.DefaultSort, EditEvents = programModel.EditEvents }; programRunModel.QueryHtml = GetQueryHtml(programRunModel.ProgramQueries, localizer); programRunModel.QueryData = GetQueryData(programRunModel.ProgramQueries); programRunModel.GridColNames = GetColNames(programRunModel.ProgramFields); programRunModel.GridColModels = GetColModels(programRunModel.ProgramFields); programRunModel.DefaultSort = programModel.DefaultSort.IsNullOrWhiteSpace() ? GetDefaultSort(programRunModel.ProgramFields) : programModel.DefaultSort; _memoryCache.Set(key, programRunModel); return programRunModel; } } /// /// 得到查询HTML /// /// /// 语言包 /// private string GetQueryHtml(List programQueries, IStringLocalizer localizer = null) { StringBuilder query_controls = new StringBuilder(); if (null == programQueries) { return ""; } foreach (var query in programQueries) { string title = query.ShowTitle.IsNullOrWhiteSpace() ? query.Field : query.ShowTitle; string controlName = query.ControlName.IsNullOrWhiteSpace() ? "ctl_" + query.Id : query.ControlName; query_controls.Append(""); query_controls.Append(""); switch (query.InputType) { case 0: //文本框 query_controls.Append(""); break; case 1://日期 query_controls.Append(""); break; case 2://日期范围 query_controls.Append(""); query_controls.Append(localizer == null ? (localizer == null ? " 至 " : localizer["To"]) : localizer["To"]); query_controls.Append(""); break; case 3://日期时间 query_controls.Append(""); break; case 4://日期时间范围 query_controls.Append(""); query_controls.Append(localizer == null ? (localizer == null ? " 至 " : localizer["To"]) : localizer["To"]); query_controls.Append(""); break; case 5://下拉选项 query_controls.Append(""); break; case 6://组织机构选择 query_controls.Append(""); break; case 7://数据字典选择 query_controls.Append(""); break; } query_controls.Append(""); } return query_controls.ToString(); } /// /// 得到查询的JSON data /// /// /// private string GetQueryData(List programQueries) { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append("\"pagesize\": size || curPageSize, \"pagenumber\": number || curPageNumber,"); foreach (var query in programQueries) { string controlName = query.ControlName.IsNullOrWhiteSpace() ? "ctl_" + query.Id : query.ControlName; stringBuilder.Append("\"" + controlName + "\":$(\"#" + controlName + "\").val(),"); if (query.InputType.In(2, 4))//如果是日期时间范围要加上截止时间 { stringBuilder.Append("\"" + controlName + "1\":$(\"#" + controlName + "1\").val(),"); } } return "{" + stringBuilder.ToString().TrimEnd(',') + "}"; } /// /// 得到Grid列头 /// /// /// private string GetColNames(List programFields) { if (null == programFields) { return string.Empty; } StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append("["); foreach (var field in programFields) { stringBuilder.Append("\"" + (field.ShowTitle.IsNullOrWhiteSpace() ? field.Field : field.ShowTitle) + "\","); } return stringBuilder.ToString().TrimEnd(',') + "]"; } /// /// 得到GRID列JSON /// /// /// private string GetColModels(List programFields) { if (null == programFields) { return string.Empty; } Newtonsoft.Json.Linq.JArray jArray = new Newtonsoft.Json.Linq.JArray(); foreach (var field in programFields) { Newtonsoft.Json.Linq.JObject jObject = new Newtonsoft.Json.Linq.JObject(); string name = field.Field; if (name.IsNullOrWhiteSpace()) { if (100 == field.ShowType) { name = "opation"; } else if (1 == field.ShowType) { name = "rowserialnumber"; } } jObject.Add("name", name); if (!field.IsSort.IsNullOrWhiteSpace()) { jObject.Add("index", field.IsSort.Trim()); } else { jObject.Add("sortable", false); } if (field.ShowType == 100) { jObject.Add("title", false); } if (field.IsShow == 0) { jObject.Add("hidedlg", true); jObject.Add("hidden", true); } if (!field.Width.IsNullOrWhiteSpace()) { jObject.Add("width", field.Width.GetNumber()); } jObject.Add("align", field.Align); jArray.Add(jObject); } return jArray.ToString(Newtonsoft.Json.Formatting.None); } /// /// 得到默认排序列 /// /// /// private string GetDefaultSort(List programFields) { if (null == programFields || programFields.Count == 0) { return string.Empty; } var filed = programFields.Find(p => !p.IsSort.IsNullOrWhiteSpace()); if (null != filed) { return filed.IsSort; } else { return programFields.First().Field + " ASC"; } } /// /// 得到运行时实体 /// /// 应用程序ID,RF_Program表ID /// 用户实体,用于判断按钮权限 /// 菜单id /// 语言包 /// public Model.ProgramRun VueGetRunModel(string id, SysUser userModel, string menuId, IStringLocalizer localizer = null) { string key = "ProgramRun_VUE_" + id; var obj = _memoryCache.Get(key); Model.ProgramRun programRunModel; if (obj != null) { programRunModel = (Model.ProgramRun)obj; } else { var programModel = GetOneById(id); if (null == programModel) { return null; } programRunModel = new Model.ProgramRun { ButtonLocation = programModel.ButtonLocation, ClientScript = programModel.ClientScript, ConnId = programModel.ConnId.ToGuid(), CreateTime = programModel.CreateTime, CreateUserId = programModel.CreateUserId.ToGuid(), EditModel = programModel.EditModel, ExportFileName = programModel.ExportFileName, ExportHeaderText = programModel.ExportHeaderText, ExportTemplate = programModel.ExportTemplate, FormId = programModel.FormId, Height = programModel.Height, Id = programModel.Id.ToGuid(), InDataNumberFiledName = programModel.InDataNumberFiledName, IsAdd = programModel.IsAdd, IsPager = programModel.IsPager, RowNumber = programModel.RowNumber, Name = programModel.Name, ProgramButtons = new ProgramButton().GetAllByProgramId(programModel.Id), ProgramExports = new ProgramExport().GetAllByProgramId(programModel.Id), ProgramFields = new ProgramField().GetAllByProgramId(programModel.Id), ProgramQueries = new ProgramQuery().GetAllByProgramId(programModel.Id), ProgramValidates = new ProgramValidate().GetAllByProgramId(programModel.Id), PublishTime = programModel.PublishTime, SelectColumn = programModel.SelectColumn, SqlString = programModel.SqlString, Status = programModel.Status, TableHead = programModel.TableHead, TableStyle = programModel.TableStyle, Type = programModel.Type.ToGuid(), Width = programModel.Width, GroupHeaders = programModel.GroupHeaders, DefaultSort = programModel.DefaultSort, EditEvents = programModel.EditEvents }; programRunModel.QueryHtml = VueGetRunHtml(programRunModel, localizer); _memoryCache.Set(key, programRunModel); } //替换按钮 if (userModel != null) { var (normalButton, listButton) = VueGetButtons(programRunModel.ProgramButtons, userModel, menuId); programRunModel.QueryHtml = programRunModel.QueryHtml.Replace("{}", normalButton); foreach (JObject jObject in programRunModel.Cols) { if (jObject.ContainsKey("buttons")) { jObject["buttons"] = listButton; } } } return programRunModel; } /// /// 得到运行时VUE组件HTML /// /// /// 语言包 /// public string VueGetRunHtml(Model.ProgramRun programRunModel, IStringLocalizer localizer = null) { if (programRunModel == null) { return string.Empty; } StringBuilder html = new StringBuilder(); #region 查询字段 string queryHtml = VueGetQueryHtml(programRunModel.ProgramQueries, localizer); html.Append("
"); html.Append(queryHtml); //查询按钮(查询后面) if (programRunModel.ButtonLocation == 1) { if (!queryHtml.IsNullOrWhiteSpace()) { html.Append("" + (localizer == null ? "查询" : localizer["Query"].Value) + ""); } //{}作为占位符,实际运行时根据当前用户获取有权限的按钮填充。 html.Append("{}"); } html.Append("
"); //查询按钮(新行) if (programRunModel.ButtonLocation == 0) { html.Append("
" + (queryHtml.IsNullOrWhiteSpace() ? string.Empty : "" + (localizer == null ? "查询" : localizer["Query"].Value) + "") + "{}
"); } #endregion #region 列表 html.Append(""); programRunModel.Cols = VueGetCols(programRunModel.ProgramFields); #endregion return html.ToString(); } /// /// 获取按钮 /// /// /// /// 菜单id /// (常规按钮,列表按钮) public (string, JArray) VueGetButtons(List programButtons, SysUser userModel, string menuId) { StringBuilder button_normal = new StringBuilder(); JArray button_list = new JArray(); List menuusers = new MenuUser().GetAll(); Menu menu = new Menu(); SystemButton systemButton = new SystemButton(); string language = Tools.GetCurrentLanguage(); foreach (var button in programButtons.OrderBy(p => p.Sort)) { //检查权限 if (1 == button.IsValidateShow) { if (!menu.HasUseButton(menuId, button.Id, userModel.Id, menuusers)) { continue; } } string butName = button.ButtonName; string ico = button.Ico; string note = button.Note; if (button.ShowType == 1)//常规按钮 { button_normal.Append(""); if (!butName.IsNullOrWhiteSpace()) { button_normal.Append(butName); } button_normal.Append(""); } else if (button.ShowType == 2)//列表按钮 不替换通配符,列表按钮涉及运行时数据,在运行时替换。 { button_list.Add(new JObject() { { "title", butName }, { "ico", ico }, { "fun", RoadFlow.Business.Wildcard.Filter(button.ClientScript, userModel).UrlEncode()}, { "note", note }, }); } } return (button_normal.ToString(), button_list); } /// /// 得到VUE查询HTML /// /// /// 语言包 /// public string VueGetQueryHtml(List programQueries, IStringLocalizer localizer = null) { if (null == programQueries) { return string.Empty; } StringBuilder query_controls = new StringBuilder(); foreach (var query in programQueries) { string title = query.ShowTitle.IsNullOrWhiteSpace() ? query.Field : query.ShowTitle; string controlName = query.ControlName.IsNullOrWhiteSpace() ? "ctl_" + query.Id : query.ControlName; query_controls.Append(""); query_controls.Append(title + ":"); switch (query.InputType) { case 0: //文本框 query_controls.Append(""); break; case 1://日期 query_controls.Append(""); break; case 2://日期范围 query_controls.Append(""); query_controls.Append(localizer == null ? " 至 " : localizer["To"].Value); query_controls.Append(""); break; case 3://日期时间 query_controls.Append(""); break; case 4://日期时间范围 query_controls.Append(""); query_controls.Append(localizer == null ? " 至 " : localizer["To"].Value); query_controls.Append(""); break; case 5://下拉选项 query_controls.Append(""); break; case 6://组织机构选择 query_controls.Append("("selectrange");//选择范围 string multiple = orgJObject.Value("multiple");//多选 JArray selecttype = orgJObject.Value("selecttype");//选择类型 JArray selecttype1 = new JArray(); foreach (JValue j in selecttype) { if (!j.ToString().IsNullOrWhiteSpace()) { selecttype1.Add(j); } } if (selecttype1.Count == 0)//没有设置时为全部可选 { selecttype1.Add("unit"); selecttype1.Add("dept"); selecttype1.Add("station"); selecttype1.Add("user"); selecttype1.Add("workgroup"); } query_controls.Append("1".Equals(multiple) ? " multiple" : ""); query_controls.Append(selectrange.IsNullOrWhiteSpace() ? "" : " root='" + selectrange + "'"); query_controls.Append(" :selecttype='" + selecttype1.ToString(Newtonsoft.Json.Formatting.None) + "'"); } query_controls.Append(">"); break; } query_controls.Append(""); } return query_controls.ToString(); } /// /// 得到列设置 /// /// /// public JArray VueGetCols(List programFields) { JArray jArray = new JArray { //添加id列 new JObject() { { "name", "Id" }, { "title", "" }, { "order", "none" }, { "width", "" }, { "key", true }, { "show", 0 }, } }; foreach (var field in programFields) { JObject jObject = new JObject() { { "name", field.Field }, { "title", field.ShowTitle.IsNullOrEmpty() ? field.Field :field.ShowTitle }, { "width", field.Width }, { "align", field.Align }, }; if (field.IsSort.IsNullOrWhiteSpace()) { jObject.Add("order", "none"); } if (field.IsShow == 0) { jObject.Add("show", 0); } if (field.ShowType == 100)//操作列 { jObject["name"] = "Opation"; jObject["order"] = "none"; jObject.Add("type", "buttons"); jObject.Add("buttons", new JArray()); } else if (field.ShowType == 1)//序号列 { jObject["name"] = "RowSerialNumber"; } else if (field.ShowType.In(8, 9, 10))//显示附件,全部显示,不省略内容, 列加属性noellipsis:true { jObject.Add("noellipsis", true); } jArray.Add(jObject); } return jArray; } } }