using System; using System.Collections.Generic; using System.Text; using Ewide.Core; using RoadFlow.Data; using RoadFlow.Utility; namespace RoadFlow.Business { /// /// 通配符类 /// public class Wildcard { private static readonly string[] wildcardList = new string[] { "{}", "{}", "{}", "{}", "{}", "{}", "{}", "{}", "{}", "{}", "{}", "{}", "{}", "{}", "{}", "{}", "{}", "{}", "{}", "{}", "{}", "{}", "{}", "{}", "{}", "{}", "{}", "{}", "{}", "{}", "{}", "{}", "{}", "{}", "{}", "{}", "{}", "{}", "{}", "{}", "{}", "{}", "{}", "{}", "{}", "{}", "{Query<", "{Form<", "{DataRow<", "{Date<", "{Method<", "{SQL<", "{JArray<", "{JObject<" }; public static string GetWildcardValue(string wildcard, SysUser userModel, object obj) { IUserManager userManager = Furion.App.GetService(); UserDummy user = new UserDummy(); var httpContext = Tools.HttpContext; Microsoft.AspNetCore.Http.HttpRequest request = httpContext?.Request; switch (wildcard.ToLower()) { case "{}"://当前用户ID userModel = userModel ?? userManager.User; return userModel == null ? "" : userModel.Id.ToUpper(); case "{}"://当前用户姓名 userModel = userModel ?? userManager.User; return userModel == null ? "" : userModel.Name; case "{}"://当前帐号 userModel = userModel ?? userManager.User; return userModel == null ? "" : userModel.Account; case "{}"://当前用户部门ID userModel = userModel ?? userManager.User; if (userModel == null) { return ""; } var dept = user.GetDept(userModel.Id); return dept == null ? "" : dept.Id.ToUpper(); case "{}"://当前用户部门名称 userModel = userModel ?? userManager.User; if (userModel == null) { return ""; } var dept1 = user.GetDept(userModel.Id); return dept1 == null ? "" : dept1.Name; case "{}"://当前用户岗位ID userModel = userModel ?? userManager.User; if (userModel == null) { return ""; } var station = user.GetStation(userModel.Id); return station == null ? "" : station.Id.ToUpper(); case "{}"://当前用户岗位名称 userModel = userModel ?? userManager.User; if (userModel == null) { return ""; } var station1 = user.GetStation(userModel.Id); return station1 == null ? "" : station1.Name; case "{}"://当前用户工作组ID userModel = userModel ?? userManager.User; return userModel == null ? "" : user.GetWorkGroupsId(userModel.Id); case "{}"://当前用户工作组名称 userModel = userModel ?? userManager.User; return userModel == null ? "" : user.GetWorkGroupsName(userModel.Id); case "{}"://当前用户部门领导ID userModel = userModel ?? userManager.User; return userModel == null ? "" : user.GetLeader(userModel.Id.ToString()); case "{}"://当前用户部门领导姓名 userModel = userModel ?? userManager.User; return userModel == null ? "" : user.GetNames(user.GetLeader(userModel.Id)); case "{}"://当前用户分管领导ID userModel = userModel ?? userManager.User; return userModel == null ? "" : user.GetLeader(userModel.Id); case "{}"://当前用户分管领导姓名 userModel = userModel ?? userManager.User; return userModel == null ? "" : user.GetNames(user.GetLeader(userModel.Id)); case "{}"://当前用户单位ID userModel = userModel ?? userManager.User; if (userModel == null) { return ""; } var unit = user.GetUnit(userModel.Id); return unit == null ? "" : unit.Id.ToUpper(); case "{}"://当前用户单位名称 userModel = userModel ?? userManager.User; if (userModel == null) { return ""; } var unit1 = user.GetUnit(userModel.Id.ToString()); return unit1 == null ? "" : unit1.Name; case "{}"://发起者ID userModel = userModel ?? userManager.User; var firstId = new FlowTask().GetFirstSenderId(request.Querys("groupid")); return firstId.IsNullOrWhiteSpace() && userModel != null ? userModel.Id.ToString() : firstId.ToString(); case "{}"://发起者姓名 userModel = userModel ?? userManager.User; var firstId1 = new FlowTask().GetFirstSenderId(request.Querys("groupid")); return firstId1.IsNullOrWhiteSpace() && userModel != null ? userModel.Name : user.GetName(firstId1); case "{}"://发起者部门ID userModel = userModel ?? userManager.User; var firstId2 = new FlowTask().GetFirstSenderId(request.Querys("groupid")); if (firstId2.IsNullOrWhiteSpace() && null != userModel) { firstId2 = userModel.Id; } var dept2 = user.GetDept(firstId2.ToString()); return null == dept2 ? "" : dept2.Id.ToString(); case "{}"://发起者部门名称 userModel = userModel ?? userManager.User; var firstId3 = new FlowTask().GetFirstSenderId(request.Querys("groupid")); if (firstId3.IsNullOrWhiteSpace() && null != userModel) { firstId3 = userModel.Id; } var dept3 = user.GetDept(firstId3.ToString()); return dept3 == null ? "" : dept3.Name; case "{}"://发起者岗位ID userModel = userModel ?? userManager.User; var firstId4 = new FlowTask().GetFirstSenderId(request.Querys("groupid")); if (firstId4.IsNullOrWhiteSpace() && null != userModel) { firstId4 = userModel.Id; } var station4 = user.GetStation(firstId4.ToString()); return station4 == null ? "" : station4.Id.ToString(); case "{}"://发起者岗位名称 var firstId5 = new FlowTask().GetFirstSenderId(request.Querys("groupid")); userModel = userModel ?? userManager.User; if (firstId5.IsNullOrWhiteSpace() && null != userModel) { firstId5 = userModel.Id; } var station5 = user.GetStation(firstId5.ToString()); return station5 == null ? "" : station5.Name; case "{}"://发起者角色组ID var firstId6 = new FlowTask().GetFirstSenderId(request.Querys("groupid")); userModel = userModel ?? userManager.User; if (firstId6.IsNullOrWhiteSpace() && null != userModel) { firstId6 = userModel.Id; } return user.GetWorkGroupsId(firstId6); case "{}"://发起者角色组名称 var firstId7 = new FlowTask().GetFirstSenderId(request.Querys("groupid")); userModel = userModel ?? userManager.User; if (firstId7.IsNullOrWhiteSpace() && null != userModel) { firstId7 = userModel.Id; } return user.GetWorkGroupsName(firstId7); case "{}"://发起者单位ID var firstId8 = new FlowTask().GetFirstSenderId(request.Querys("groupid")); userModel = userModel ?? userManager.User; if (firstId8.IsNullOrWhiteSpace() && null != userModel) { firstId8 = userModel.Id; } var unit8 = user.GetUnit(firstId8.ToString()); return unit8 == null ? "" : unit8.Id.ToString(); case "{}"://发起者单位名称 var firstId9 = new FlowTask().GetFirstSenderId(request.Querys("groupid")); userModel = userModel ?? userManager.User; if (firstId9.IsNullOrWhiteSpace() && null != userModel) { firstId9 = userModel.Id; } var unit9 = user.GetUnit(firstId9.ToString()); return unit9 == null ? "" : unit9.Name; case "{}"://发起者部门领导ID var firstId10 = new FlowTask().GetFirstSenderId(request.Querys("groupid")); userModel = userModel ?? userManager.User; if (firstId10.IsNullOrWhiteSpace() && null != userModel) { firstId10 = userModel.Id; } return user.GetLeader(firstId10.ToString()); case "{}"://发起者部门领导姓名 var firstId11 = new FlowTask().GetFirstSenderId(request.Querys("groupid")); userModel = userModel ?? userManager.User; if (firstId11.IsNullOrWhiteSpace() && null != userModel) { firstId11 = userModel.Id; } return user.GetNames(user.GetLeader(firstId11)); case "{}"://发起者分管领导ID var firstId12 = new FlowTask().GetFirstSenderId(request.Querys("groupid")); userModel = userModel ?? userManager.User; if (firstId12.IsNullOrWhiteSpace() && null != userModel) { firstId12 = userModel.Id; } return user.GetLeader(firstId12.ToString()); case "{}"://发起者分管领导姓名 var firstId13 = new FlowTask().GetFirstSenderId(request.Querys("groupid")); userModel = userModel ?? userManager.User; if (firstId13.IsNullOrWhiteSpace() && null != userModel) { firstId13 = userModel.Id; } return user.GetNames(user.GetLeader(firstId13.ToString())); case "{}"://短日期格式(yyyy-MM-dd) return DateExtensions.Now.ToString("yyyy-MM-dd"); case "{}"://长日期格式(yyyy年MM月dd日) return DateExtensions.Now.ToString("yyyy年MM月dd日"); case "{}"://短日期时间(yyyy-MM-dd HH:mm) return DateExtensions.Now.ToString("yyyy-MM-dd HH:mm"); case "{}"://长日期格式(yyyy年MM月dd日 HH时mm分) return DateExtensions.Now.ToString("yyyy年MM月dd日 HH时mm分"); case "{}"://短日期时间(yyyy-MM-dd HH:mm:ss) return DateExtensions.Now.ToString("yyyy-MM-dd HH:mm:ss"); case "{}"://长日期格式(yyyy年MM月dd日 HH时mm分ss秒) return DateExtensions.Now.ToString("yyyy年MM月dd日 HH时mm分ss秒"); case "{}"://流程ID return request.Querys("flowid").IsNullOrWhiteSpace() ? GetValueFromObj(obj, "flowid") : request.Querys("flowid"); case "{}"://流程名称 string flowId = request.Querys("flowid").IsNullOrWhiteSpace() ? GetValueFromObj(obj, "flowid") : request.Querys("flowid"); return !flowId.IsGuid() ? "" : new Flow().GetOneById(flowId).Name; case "{}"://流程步骤ID return request.Querys("stepid").IsNullOrWhiteSpace() ? GetValueFromObj(obj, "stepid") : request.Querys("stepid"); case "{}"://流程步骤名称 string flowId1 = request.Querys("flowid").IsNullOrWhiteSpace() ? GetValueFromObj(obj, "flowid") : request.Querys("flowid"); string stepId = request.Querys("stepid").IsNullOrWhiteSpace() ? GetValueFromObj(obj, "stepid") : request.Querys("stepid"); return flowId1.IsGuid() ? new Flow().GetStepName(flowId1, stepId.ToGuid()) : string.Empty; case "{}"://任务ID return request.Querys("taskid").IsNullOrWhiteSpace() ? GetValueFromObj(obj, "taskid") : request.Querys("taskid"); case "{}"://实例ID string instanceId = request.Querys("instanceid"); if (instanceId.IsNullOrWhiteSpace()) { instanceId = GetValueFromObj(obj, "instanceid"); } if (instanceId.IsNullOrWhiteSpace()) { instanceId = request.Forms("form_instanceid"); } if (instanceId.IsNullOrWhiteSpace()) { instanceId = request.Querys("instanceid1"); } return instanceId; case "{}"://组ID return request.Querys("groupid").IsNullOrWhiteSpace() ? GetValueFromObj(obj, "groupid") : request.Querys("groupid"); case "{}"://前一步实例ID return new FlowTask().GetPrevInstanceID(request.Querys("taskid").IsNullOrWhiteSpace() ? GetValueFromObj(obj, "taskid") : request.Querys("taskid")); case "{}"://前一步流程任务标题 return new FlowTask().GetPrevTitle(request.Querys("taskid").IsNullOrWhiteSpace() ? GetValueFromObj(obj, "taskid") : request.Querys("taskid")); case "{}"://随机生成UUID return GuidExtensions.NewGuid().ToString(); case "{}"://空UUID return Guid.Empty.ToString(); } return ""; } /// /// 从对象中获取值 /// /// /// /// private static string GetValueFromObj(object obj, string idName) { if (obj == null || idName.IsNullOrWhiteSpace()) { return string.Empty; } if (obj is Model.FlowRunModel.Execute executeModel) { switch (idName.ToLower()) { case "flowid": return executeModel.FlowId.ToString(); case "stepid": return executeModel.StepId.ToString(); case "taskid": return executeModel.TaskId.ToString(); case "instanceid": return executeModel.InstanceId.ToString(); case "groupid": return executeModel.GroupId.ToString(); } } else if (obj is Model.rf_flowtask taskModel) { switch (idName.ToLower()) { case "flowid": return taskModel.FlowId.ToString(); case "stepid": return taskModel.StepId.ToString(); case "taskid": return taskModel.Id.ToString(); case "instanceid": return taskModel.InstanceId.ToString(); case "groupid": return taskModel.GroupId.ToString(); } } return string.Empty; } /// /// 过滤通配符 /// /// /// 当前登录用户实体 /// 对象 /// public static string Filter(string str, SysUser user = null, object obj = null) { if (str.IsNullOrWhiteSpace()) { return ""; } var httpContent = Tools.HttpContext; Microsoft.AspNetCore.Http.HttpRequest request = httpContent?.Request; foreach (string wildcard in wildcardList) { while (str.ContainsIgnoreCase(wildcard)) { string value = string.Empty; string wildcard1 = wildcard; if ("{Query<".EqualsIgnoreCase(wildcard)) { string key = str.Substring(str.IndexOf("{Query<") + 7); string key1 = key.Substring(0, key.IndexOf(">}")); if (!key1.IsNullOrWhiteSpace()) { wildcard1 = wildcard + key1 + ">}"; value = request.Querys(key1).FilterSelectSql();//2021-3-8增加了.FilterSelectSql(),过滤危险SQL。 } } else if ("{Form<".EqualsIgnoreCase(wildcard)) { string key = str.Substring(str.IndexOf("{Form<") + 6); string key1 = key.Substring(0, key.IndexOf(">}")); if (!key1.IsNullOrWhiteSpace()) { wildcard1 = wildcard + key1 + ">}"; value = request.Forms(key1).FilterSelectSql();//2021-3-8增加了.FilterSelectSql(),过滤危险SQL。 } } else if ("{DataRow<".EqualsIgnoreCase(wildcard)) { string key = str.Substring(str.IndexOf("{DataRow<") + 9); string key1 = key.Substring(0, key.IndexOf(">}")); if (!key1.IsNullOrWhiteSpace()) { wildcard1 = wildcard + key1 + ">}"; var dr = (System.Data.DataRow)obj; try { value = dr[key1].ToString().FilterSelectSql();//2021-3-8增加了.FilterSelectSql(),过滤危险SQL。 } catch { value = ""; } } } else if ("{Method<".EqualsIgnoreCase(wildcard)) { //执行一个方法替换通配符 object为方法参数 string key = str.Substring(str.IndexOf("{Method<") + 8); string key1 = key.Substring(0, key.IndexOf(">}")); if (!key1.IsNullOrWhiteSpace()) { wildcard1 = wildcard + key1 + ">}"; var (o, err) = obj == null ? Tools.ExecuteMethod(key1) : Tools.ExecuteMethod(key1, obj); value = null == o ? "" : o.ToString().FilterSelectSql();//2021-3-8增加了.FilterSelectSql(),过滤危险SQL。 } } else if ("{SQL<".EqualsIgnoreCase(wildcard)) { //执行一个SQL替换通配符 string key = str.Substring(str.IndexOf("{SQL<") + 5); string key1 = key.Substring(0, key.IndexOf(">}")); if (!key1.IsNullOrWhiteSpace()) { wildcard1 = wildcard + key1 + ">}"; value = new DbConnection().GetFieldValue(key1).FilterSelectSql();//2021-3-8增加了.FilterSelectSql(),过滤危险SQL。 } } else if ("{Date<".EqualsIgnoreCase(wildcard)) { //取当前日期替换指定格式 string key = str.Substring(str.IndexOf("{Date<") + 6); string key1 = key.Substring(0, key.IndexOf(">}")); if (!key1.IsNullOrWhiteSpace()) { wildcard1 = wildcard + key1 + ">}"; value = DateExtensions.Now.ToString(key1); } } else if ("{Object<".EqualsIgnoreCase(wildcard)) { //将对象转换为字符串替换 string key = str.Substring(str.IndexOf("{Object<") + 8); string key1 = key.Substring(0, key.IndexOf(">}")); if (!key1.IsNullOrWhiteSpace()) { wildcard1 = wildcard + key1 + ">}"; value = obj == null ? "" : obj.ToString(); } } else if ("{JArray<".EqualsIgnoreCase(wildcard)) { //取json数组值 string key = str.Substring(str.IndexOf("{JArray<") + 8); string key1 = key.Substring(0, key.IndexOf(">}")); if (!key1.IsNullOrWhiteSpace()) { wildcard1 = wildcard + key1 + ">}"; Newtonsoft.Json.Linq.JArray jArray = (Newtonsoft.Json.Linq.JArray)obj; if (null != jArray) { foreach (Newtonsoft.Json.Linq.JObject jObject in jArray) { if (jObject.ContainsKey(key1)) { value = jObject.Value(key1); break; } } if (value.IsNullOrEmpty()) { //这里循环找是取表单数据形式的JSON [{"name":"","value":""}] 这里取表单字段对应的值 foreach (Newtonsoft.Json.Linq.JObject jObject in jArray) { if (jObject.ContainsKey("name") && jObject.Value("name").Equals(key1)) { value = jObject.Value("value"); break; } } } } else { value = ""; } } } else if ("{JObject<".EqualsIgnoreCase(wildcard)) { //取json对象值 string key = str.Substring(str.IndexOf("{JObject<") + 9); string key1 = key.Substring(0, key.IndexOf(">}")); if (!key1.IsNullOrWhiteSpace()) { wildcard1 = wildcard + key1 + ">}"; Newtonsoft.Json.Linq.JObject jObject = (Newtonsoft.Json.Linq.JObject)obj; if (null != jObject && jObject.ContainsKey(key1)) { value = jObject.Value(key1); } else { value = ""; } } } else { value = GetWildcardValue(wildcard, user, obj); } str = str.ReplaceIgnoreCase(wildcard1, value); } } return str; } } }