Files
number_zj/20220330_Vote/Ewide.RoadFlow/Data/Wildcard.cs
2022-03-30 17:54:33 +08:00

541 lines
27 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.Collections.Generic;
using System.Text;
using Ewide.Core;
using RoadFlow.Data;
using RoadFlow.Utility;
namespace RoadFlow.Business
{
/// <summary>
/// 通配符类
/// </summary>
public class Wildcard
{
private static readonly string[] wildcardList = new string[] {
"{<UserId>}",
"{<UserName>}",
"{<UserAccount>}",
"{<UserDeptId>}",
"{<UserDeptName>}",
"{<UserStationId>}",
"{<UserStationName>}",
"{<UserWorkGroupId>}",
"{<UserWorkGroupName>}",
"{<UserDeptLeaderId>}",
"{<UserDeptLeaderName>}",
"{<UserCharegLeaderId>}",
"{<UserCharegLeaderName>}",
"{<UserUnitId>}",
"{<UserUnitName>}",
"{<InitiatorId>}",
"{<InitiatorName>}",
"{<InitiatorDeptId>}",
"{<InitiatorDeptName>}",
"{<InitiatorStationId>}",
"{<InitiatorStationName>}",
"{<InitiatorRoleId>}",
"{<InitiatorRoleName>}",
"{<InitiatorUnitId>}",
"{<InitiatorUnitName>}",
"{<InitiatorLeaderId>}",
"{<InitiatorLeaderName>}",
"{<InitiatorCharegId>}",
"{<InitiatorCharegName>}",
"{<ShortDate>}",
"{<LongDate>}",
"{<ShortDateTime>}",
"{<LongDateTime>}",
"{<ShortDateTimeSecond>}",
"{<LongDateTimeSecond>}",
"{<FlowId>}",
"{<FlowName>}",
"{<StepId>}",
"{<StepName>}",
"{<TaskId>}",
"{<InstanceId>}",
"{<GroupId>}",
"{<PrevInstanceId>}",
"{<PrevFlowTitle>}",
"{<Guid>}",
"{<EmptyGuid>}",
"{Query<",
"{Form<",
"{DataRow<",
"{Date<",
"{Method<",
"{SQL<",
"{JArray<",
"{JObject<"
};
public static string GetWildcardValue(string wildcard, SysUser userModel, object obj)
{
IUserManager userManager = Furion.App.GetService<IUserManager>();
UserDummy user = new UserDummy();
var httpContext = Tools.HttpContext;
Microsoft.AspNetCore.Http.HttpRequest request = httpContext?.Request;
switch (wildcard.ToLower())
{
case "{<userid>}"://当前用户ID
userModel = userModel ?? userManager.User;
return userModel == null ? "" : userModel.Id.ToUpper();
case "{<username>}"://当前用户姓名
userModel = userModel ?? userManager.User;
return userModel == null ? "" : userModel.Name;
case "{<useraccount>}"://当前帐号
userModel = userModel ?? userManager.User;
return userModel == null ? "" : userModel.Account;
case "{<userdeptid>}"://当前用户部门ID
userModel = userModel ?? userManager.User;
if (userModel == null)
{
return "";
}
var dept = user.GetDept(userModel.Id);
return dept == null ? "" : dept.Id.ToUpper();
case "{<userdeptname>}"://当前用户部门名称
userModel = userModel ?? userManager.User;
if (userModel == null)
{
return "";
}
var dept1 = user.GetDept(userModel.Id);
return dept1 == null ? "" : dept1.Name;
case "{<userstationid>}"://当前用户岗位ID
userModel = userModel ?? userManager.User;
if (userModel == null)
{
return "";
}
var station = user.GetStation(userModel.Id);
return station == null ? "" : station.Id.ToUpper();
case "{<userstationname>}"://当前用户岗位名称
userModel = userModel ?? userManager.User;
if (userModel == null)
{
return "";
}
var station1 = user.GetStation(userModel.Id);
return station1 == null ? "" : station1.Name;
case "{<userworkgroupid>}"://当前用户工作组ID
userModel = userModel ?? userManager.User;
return userModel == null ? "" : user.GetWorkGroupsId(userModel.Id);
case "{<userworkgroupname>}"://当前用户工作组名称
userModel = userModel ?? userManager.User;
return userModel == null ? "" : user.GetWorkGroupsName(userModel.Id);
case "{<userdeptleaderid>}"://当前用户部门领导ID
userModel = userModel ?? userManager.User;
return userModel == null ? "" : user.GetLeader(userModel.Id.ToString());
case "{<userdeptleadername>}"://当前用户部门领导姓名
userModel = userModel ?? userManager.User;
return userModel == null ? "" : user.GetNames(user.GetLeader(userModel.Id));
case "{<usercharegleaderid>}"://当前用户分管领导ID
userModel = userModel ?? userManager.User;
return userModel == null ? "" : user.GetLeader(userModel.Id);
case "{<usercharegleadername>}"://当前用户分管领导姓名
userModel = userModel ?? userManager.User;
return userModel == null ? "" : user.GetNames(user.GetLeader(userModel.Id));
case "{<userunitid>}"://当前用户单位ID
userModel = userModel ?? userManager.User;
if (userModel == null)
{
return "";
}
var unit = user.GetUnit(userModel.Id);
return unit == null ? "" : unit.Id.ToUpper();
case "{<userunitname>}"://当前用户单位名称
userModel = userModel ?? userManager.User;
if (userModel == null)
{
return "";
}
var unit1 = user.GetUnit(userModel.Id.ToString());
return unit1 == null ? "" : unit1.Name;
case "{<initiatorid>}"://发起者ID
userModel = userModel ?? userManager.User;
var firstId = new FlowTask().GetFirstSenderId(request.Querys("groupid"));
return firstId.IsNullOrWhiteSpace() && userModel != null ? userModel.Id.ToString() : firstId.ToString();
case "{<initiatorname>}"://发起者姓名
userModel = userModel ?? userManager.User;
var firstId1 = new FlowTask().GetFirstSenderId(request.Querys("groupid"));
return firstId1.IsNullOrWhiteSpace() && userModel != null ? userModel.Name : user.GetName(firstId1);
case "{<initiatordeptid>}"://发起者部门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 "{<initiatordeptname>}"://发起者部门名称
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 "{<initiatorstationid>}"://发起者岗位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 "{<initiatorstationname>}"://发起者岗位名称
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 "{<initiatorworkgroupid>}"://发起者角色组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 "{<initiatorworkgroupname>}"://发起者角色组名称
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 "{<initiatorunitid>}"://发起者单位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 "{<initiatorunitname>}"://发起者单位名称
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 "{<initiatorleaderid>}"://发起者部门领导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 "{<initiatorleadername>}"://发起者部门领导姓名
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 "{<initiatorcharegid>}"://发起者分管领导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 "{<initiatorcharegname>}"://发起者分管领导姓名
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 "{<shortdate>}"://短日期格式(yyyy-MM-dd)
return DateExtensions.Now.ToString("yyyy-MM-dd");
case "{<longdate>}"://长日期格式(yyyy年MM月dd日)
return DateExtensions.Now.ToString("yyyy年MM月dd日");
case "{<shortdatetime>}"://短日期时间(yyyy-MM-dd HH:mm)
return DateExtensions.Now.ToString("yyyy-MM-dd HH:mm");
case "{<longdatetime>}"://长日期格式(yyyy年MM月dd日 HH时mm分)
return DateExtensions.Now.ToString("yyyy年MM月dd日 HH时mm分");
case "{<shortdatetimesecond>}"://短日期时间(yyyy-MM-dd HH:mm:ss)
return DateExtensions.Now.ToString("yyyy-MM-dd HH:mm:ss");
case "{<longdatetimesecond>}"://长日期格式(yyyy年MM月dd日 HH时mm分ss秒)
return DateExtensions.Now.ToString("yyyy年MM月dd日 HH时mm分ss秒");
case "{<flowid>}"://流程ID
return request.Querys("flowid").IsNullOrWhiteSpace() ? GetValueFromObj(obj, "flowid") : request.Querys("flowid");
case "{<flowname>}"://流程名称
string flowId = request.Querys("flowid").IsNullOrWhiteSpace() ? GetValueFromObj(obj, "flowid") : request.Querys("flowid");
return !flowId.IsGuid() ? "" : new Flow().GetOneById(flowId).Name;
case "{<stepid>}"://流程步骤ID
return request.Querys("stepid").IsNullOrWhiteSpace() ? GetValueFromObj(obj, "stepid") : request.Querys("stepid");
case "{<stepname>}"://流程步骤名称
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 "{<taskid>}"://任务ID
return request.Querys("taskid").IsNullOrWhiteSpace() ? GetValueFromObj(obj, "taskid") : request.Querys("taskid");
case "{<instanceid>}"://实例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 "{<groupid>}"://组ID
return request.Querys("groupid").IsNullOrWhiteSpace() ? GetValueFromObj(obj, "groupid") : request.Querys("groupid");
case "{<previnstanceid>}"://前一步实例ID
return new FlowTask().GetPrevInstanceID(request.Querys("taskid").IsNullOrWhiteSpace() ? GetValueFromObj(obj, "taskid") : request.Querys("taskid"));
case "{<prevflowtitle>}"://前一步流程任务标题
return new FlowTask().GetPrevTitle(request.Querys("taskid").IsNullOrWhiteSpace() ? GetValueFromObj(obj, "taskid") : request.Querys("taskid"));
case "{<guid>}"://随机生成UUID
return GuidExtensions.NewGuid().ToString();
case "{<emptyguid>}"://空UUID
return Guid.Empty.ToString();
}
return "";
}
/// <summary>
/// 从对象中获取值
/// </summary>
/// <param name="obj"></param>
/// <param name="idName"></param>
/// <returns></returns>
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;
}
/// <summary>
/// 过滤通配符
/// </summary>
/// <param name="str"></param>
/// <param name="currentUser">当前登录用户实体</param>
/// <param name="obj">对象</param>
/// <returns></returns>
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<string>(key1);
break;
}
}
if (value.IsNullOrEmpty())
{
//这里循环找是取表单数据形式的JSON [{"name":"","value":""}] 这里取表单字段对应的值
foreach (Newtonsoft.Json.Linq.JObject jObject in jArray)
{
if (jObject.ContainsKey("name") && jObject.Value<string>("name").Equals(key1))
{
value = jObject.Value<string>("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<string>(key1);
}
else
{
value = "";
}
}
}
else
{
value = GetWildcardValue(wildcard, user, obj);
}
str = str.ReplaceIgnoreCase(wildcard1, value);
}
}
return str;
}
}
}