You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1339 lines
49 KiB
Plaintext

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System;
using System.Collections.Generic;
using System.Reflection;
using System.Text;
using System.Collections;
using BP.DA;
using BP.En;
using BP.Port;
using BP.Web;
using BP.Difference;
using BP.Tools;
using Newtonsoft.Json.Linq;
namespace BP.Sys
{
/// <summary>
/// 事件属性
/// </summary>
public class FrmEventAttr
{
/// <summary>
/// 事件类型
/// </summary>
public const string FK_Event = "EventID";
/// <summary>
/// 表单ID
/// </summary>
public const string FrmID = "FrmID";
/// <summary>
/// 流程编号
/// </summary>
public const string FK_Flow = "FK_Flow";
/// <summary>
/// 节点ID
/// </summary>
public const string FK_Node = "FK_Node";
/// <summary>
/// 事件源
/// </summary>
public const string EventSource = "EventSource";
/// <summary>
/// 关联的流程编号
/// </summary>
public const string RefFlowNo = "RefFlowNo";
/// <summary>
/// 执行类型
/// </summary>
public const string EventDoType = "EventDoType";
/// <summary>
/// 数据源
/// </summary>
public const string FK_DBSrc = "FK_DBSrc";
/// <summary>
/// 执行内容
/// </summary>
public const string DoDoc = "DoDoc";
/// <summary>
/// 标签
/// </summary>
public const string MsgOK = "MsgOK";
/// <summary>
/// 执行错误提示
/// </summary>
public const string MsgError = "MsgError";
#region 消息设置.
/// <summary>
/// 控制方式
/// </summary>
public const string MsgCtrl = "MsgCtrl";
/// <summary>
/// 邮件是否启用
/// </summary>
public const string MailEnable = "MailEnable";
/// <summary>
/// 消息标题
/// </summary>
public const string MailTitle = "MailTitle";
/// <summary>
/// 消息内容模版
/// </summary>
public const string MailDoc = "MailDoc";
/// <summary>
/// 是否启用短信
/// </summary>
public const string SMSEnable = "SMSEnable";
/// <summary>
/// 短信内容模版
/// </summary>
public const string SMSDoc = "SMSDoc";
/// <summary>
/// 是否推送?
/// </summary>
public const string MobilePushEnable = "MobilePushEnable";
/// <summary>
/// DLL路径
/// </summary>
public const string MonthedDLL = "MonthedDLL";
/// <summary>
/// DLL中所选的类名
/// </summary>
public const string MonthedClass = "MonthedClass";
/// <summary>
/// DLL中所选类中的方法字符串
/// </summary>
public const string MonthedName = "MonthedName";
/// <summary>
/// DLL中所选类所选方法的参数表达式
/// </summary>
public const string MonthedParas = "MonthedParas";
#endregion 消息设置.
}
/// <summary>
/// 事件
/// 节点的节点保存事件有两部分组成.
/// 记录了从一个节点到其他的多个节点.
/// 也记录了到这个节点的其他的节点.
/// </summary>
public class FrmEvent : EntityMyPK
{
#region 参数属性.
/// <summary>
/// 名称
/// </summary>
public string MonthedDLL
{
get
{
return this.GetParaString(FrmEventAttr.MonthedDLL);
}
set
{
this.SetPara(FrmEventAttr.MonthedDLL, value);
}
}
/// <summary>
/// 类名
/// </summary>
public string MonthedClass
{
get
{
return this.GetParaString(FrmEventAttr.MonthedClass);
}
set
{
this.SetPara(FrmEventAttr.MonthedClass, value);
}
}
/// <summary>
/// 方法名
/// </summary>
public string MonthedName
{
get
{
return this.GetParaString(FrmEventAttr.MonthedName);
}
set
{
this.SetPara(FrmEventAttr.MonthedName, value);
}
}
/// <summary>
/// 方法参数.
/// </summary>
public string MonthedParas
{
get
{
return this.GetParaString(FrmEventAttr.MonthedParas);
}
set
{
this.SetPara(FrmEventAttr.MonthedParas, value);
}
}
public string DBSrcNo
{
get
{
return this.GetValStringByKey(FrmEventAttr.FK_DBSrc);
}
}
#endregion 参数属性.
#region 基本属性
public override En.UAC HisUAC
{
get
{
UAC uac = new En.UAC();
uac.IsAdjunct = false;
uac.IsDelete = false;
uac.IsInsert = false;
uac.IsUpdate = true;
return uac;
}
}
/// <summary>
/// 节点ID
/// </summary>
public int NodeID
{
get
{
return this.GetValIntByKey(FrmEventAttr.FK_Node);
}
set
{
this.SetValByKey(FrmEventAttr.FK_Node, value);
}
}
/// <summary>
/// 关联的流程编号
/// </summary>
public string RefFlowNo
{
get
{
return this.GetValStringByKey(FrmEventAttr.RefFlowNo);
}
set
{
this.SetValByKey(FrmEventAttr.RefFlowNo, value);
}
}
/// <summary>
/// 流程
/// </summary>
public string FlowNo
{
get
{
return this.GetValStringByKey(FrmEventAttr.FK_Flow);
}
set
{
this.SetValByKey(FrmEventAttr.FK_Flow, value);
}
}
/// <summary>
/// 节点
/// </summary>
public string FrmID
{
get
{
return this.GetValStringByKey(FrmEventAttr.FrmID);
}
set
{
this.SetValByKey(FrmEventAttr.FrmID, value);
}
}
public void setFrmID(string val)
{
this.SetValByKey("FrmID", val);
}
public string DoDoc
{
get
{
return this.GetValStringByKey(FrmEventAttr.DoDoc).Replace("~", "'");
}
set
{
string doc = value.Replace("'", "~");
this.SetValByKey(FrmEventAttr.DoDoc, doc);
}
}
/// <summary>
/// 执行成功提示
/// </summary>
public string MsgOK(Entity en)
{
string val = this.GetValStringByKey(FrmEventAttr.MsgOK);
if (val.Trim() == "")
return "";
if (val.IndexOf('@') == -1)
return val;
foreach (Attr attr in en.EnMap.Attrs)
{
val = val.Replace("@" + attr.Key, en.GetValStringByKey(attr.Key));
}
return val;
}
public string MsgOKString
{
get
{
return this.GetValStringByKey(FrmEventAttr.MsgOK);
}
set
{
this.SetValByKey(FrmEventAttr.MsgOK, value);
}
}
public string MsgErrorString
{
get
{
return this.GetValStringByKey(FrmEventAttr.MsgError);
}
set
{
this.SetValByKey(FrmEventAttr.MsgError, value);
}
}
/// <summary>
/// 错误或异常提示
/// </summary>
/// <param name="en"></param>
/// <returns></returns>
public string MsgError(Entity en)
{
string val = this.GetValStringByKey(FrmEventAttr.MsgError);
if (val.Trim() == "")
return null;
if (val.IndexOf('@') == -1)
return val;
foreach (Attr attr in en.EnMap.Attrs)
{
val = val.Replace("@" + attr.Key, en.GetValStringByKey(attr.Key));
}
return val;
}
public string EventNo
{
get
{
return this.GetValStringByKey(FrmEventAttr.FK_Event);
}
set
{
this.SetValByKey(FrmEventAttr.FK_Event, value);
}
}
/// <summary>
/// 执行类型
/// </summary>
public EventDoType HisDoType
{
get
{
return (EventDoType)this.GetValIntByKey(FrmEventAttr.EventDoType);
}
set
{
this.SetValByKey(FrmEventAttr.EventDoType, (int)value);
}
}
public int HisDoTypeInt
{
get
{
return this.GetValIntByKey(FrmEventAttr.EventDoType);
}
set
{
this.SetValByKey(FrmEventAttr.EventDoType, value);
}
}
#endregion
#region 事件消息.
/// <summary>
/// 消息控制类型.
/// </summary>
public MsgCtrl MsgCtrl
{
get
{
return (MsgCtrl)this.GetValIntByKey(FrmEventAttr.MsgCtrl);
}
set
{
this.SetValByKey(FrmEventAttr.MsgCtrl, (int)value);
}
}
/// <summary>
/// 是否手机推送?
/// </summary>
public bool MobilePushEnable
{
get
{
return this.GetValBooleanByKey(FrmEventAttr.MobilePushEnable);
}
set
{
this.SetValByKey(FrmEventAttr.MobilePushEnable, value);
}
}
public bool MailEnable
{
get
{
return this.GetValBooleanByKey(FrmEventAttr.MailEnable);
}
set
{
this.SetValByKey(FrmEventAttr.MailEnable, value);
}
}
/// <summary>
/// 邮件标题
/// </summary>
public string MailTitle
{
get
{
string str = this.GetValStrByKey(FrmEventAttr.MailTitle);
if (DataType.IsNullOrEmpty(str) == false)
return str;
switch (this.EventNo)
{
case EventListNode.SendSuccess:
return "新工作@Title,发送人@WebUser.No,@WebUser.Name";
case EventListNode.ShitAfter:
return "移交来的新工作@Title,移交人@WebUser.No,@WebUser.Name";
case EventListNode.ReturnAfter:
return "被退回来@Title,退回人@WebUser.No,@WebUser.Name";
case EventListNode.UndoneAfter:
return "工作被撤销@Title,发送人@WebUser.No,@WebUser.Name";
case EventListNode.AskerReAfter:
return "加签新工作@Title,发送人@WebUser.No,@WebUser.Name";
case EventListFlow.AfterFlowDel:
return "工作流程被删除@Title,发送人@WebUser.No,@WebUser.Name";
case EventListFlow.FlowOverAfter:
return "流程结束@Title,发送人@WebUser.No,@WebUser.Name";
default:
throw new Exception("@该事件类型没有定义默认的消息模版:" + this.EventNo);
break;
}
return str;
}
}
/// <summary>
/// 邮件标题
/// </summary>
public string MailTitle_Real
{
get
{
string str = this.GetValStrByKey(FrmEventAttr.MailTitle);
return str;
}
set
{
this.SetValByKey(FrmEventAttr.MailTitle, value);
}
}
/// <summary>
/// 邮件内容
/// </summary>
public string MailDoc_Real
{
get
{
return this.GetValStrByKey(FrmEventAttr.MailDoc);
}
set
{
this.SetValByKey(FrmEventAttr.MailDoc, value);
}
}
/// <summary>
/// 邮件内容模版
/// </summary>
public string MailDoc
{
get
{
string str = this.GetValStrByKey(FrmEventAttr.MailDoc);
if (DataType.IsNullOrEmpty(str) == false)
return str;
switch (this.EventNo)
{
case EventListNode.SendSuccess:
str += "\t\n您好:";
str += "\t\n 有新工作@Title需要您处理, 点击这里打开工作{Url} .";
str += "\t\n致! ";
str += "\t\n @WebUser.No, @WebUser.Name";
str += "\t\n @RDT";
break;
case EventListNode.ReturnAfter:
str += "\t\n您好:";
str += "\t\n 工作@Title被退回来了, 点击这里打开工作{Url} .";
str += "\t\n 致! ";
str += "\t\n @WebUser.No,@WebUser.Name";
str += "\t\n @RDT";
break;
case EventListNode.ShitAfter:
str += "\t\n您好:";
str += "\t\n 移交给您的工作@Title, 点击这里打开工作{Url} .";
str += "\t\n 致! ";
str += "\t\n @WebUser.No,@WebUser.Name";
str += "\t\n @RDT";
break;
case EventListNode.UndoneAfter:
str += "\t\n您好:";
str += "\t\n 移交给您的工作@Title, 点击这里打开工作{Url} .";
str += "\t\n 致! ";
str += "\t\n @WebUser.No,@WebUser.Name";
str += "\t\n @RDT";
break;
case EventListNode.AskerReAfter: //加签.
str += "\t\n您好:";
str += "\t\n 移交给您的工作@Title, 点击这里打开工作{Url} .";
str += "\t\n 致! ";
str += "\t\n @WebUser.No,@WebUser.Name";
str += "\t\n @RDT";
break;
case EventListFlow.AfterFlowDel: //流程删除
str += "\t\n您好:";
str += "\t\n 被删除的工作@Title.";
str += "\t\n 致! ";
str += "\t\n @WebUser.No,@WebUser.Name";
str += "\t\n @RDT";
break;
case EventListFlow.FlowOverAfter: //流程结束
str += "\t\n您好:";
str += "\t\n 工作@Title已经结束点击这里查看工作{Url}.";
str += "\t\n 致! ";
str += "\t\n @WebUser.No,@WebUser.Name";
str += "\t\n @RDT";
break;
default:
throw new Exception("@该事件类型没有定义默认的消息模版:" + this.EventNo);
break;
}
return str;
}
}
/// <summary>
/// 是否启用短信发送
/// </summary>
public bool SMSEnable
{
get
{
return this.GetValBooleanByKey(FrmEventAttr.SMSEnable);
}
set
{
this.SetValByKey(FrmEventAttr.SMSEnable, value);
}
}
/// <summary>
/// 短信模版内容
/// </summary>
public string SMSDoc_Real
{
get
{
string str = this.GetValStrByKey(FrmEventAttr.SMSDoc);
return str;
}
set
{
this.SetValByKey(FrmEventAttr.SMSDoc, value);
}
}
/// <summary>
/// 短信模版内容
/// </summary>
public string SMSDoc
{
get
{
string str = this.GetValStrByKey(FrmEventAttr.SMSDoc);
if (DataType.IsNullOrEmpty(str) == false)
return str;
switch (this.EventNo)
{
case EventListNode.SendSuccess:
str = "有新工作@Title需要您处理, 发送人:@WebUser.No, @WebUser.Name,打开{Url} .";
break;
case EventListNode.ReturnAfter:
str = "工作@Title被退回,退回人:@WebUser.No, @WebUser.Name,打开{Url} .";
break;
case EventListNode.ShitAfter:
str = "移交工作@Title,移交人:@WebUser.No, @WebUser.Name,打开{Url} .";
break;
case EventListNode.UndoneAfter:
str = "工作撤销@Title,撤销人:@WebUser.No, @WebUser.Name,打开{Url}.";
break;
case EventListNode.AskerReAfter: //加签.
str = "工作加签@Title,加签人:@WebUser.No, @WebUser.Name,打开{Url}.";
break;
default:
throw new Exception("@该事件类型没有定义默认的消息模版:" + this.EventNo);
break;
}
return str;
}
set
{
this.SetValByKey(FrmEventAttr.SMSDoc, value);
}
}
#endregion
#region 构造方法
/// <summary>
/// 事件
/// </summary>
public FrmEvent()
{
}
public FrmEvent(string mypk)
{
this.setMyPK(mypk);
this.RetrieveFromDBSources();
}
public FrmEvent(string fk_mapdata, string fk_Event)
{
this.EventNo = fk_Event;
this.setFrmID(fk_mapdata);
this.setMyPK(this.FrmID + "_" + this.EventNo);
this.RetrieveFromDBSources();
}
/// <summary>
/// 重写基类方法
/// </summary>
public override Map EnMap
{
get
{
if (this._enMap != null)
return this._enMap;
Map map = new Map("Sys_FrmEvent", "外部自定义事件(表单,从表,流程,节点)");
map.IndexField = FrmEventAttr.FrmID;
map.AddMyPK();
//0=表单事件,1=流程2=节点事件.
map.AddTBInt(FrmEventAttr.EventSource, 0, "事件类型", true, true);
map.AddTBString(FrmEventAttr.FK_Event, null, "事件标记", true, true, 0, 400, 10);
map.AddTBString(FrmEventAttr.RefFlowNo, null, "关联的流程编号", true, true, 0, 10, 10);
//事件类型的主键.
map.AddTBString(FrmEventAttr.FrmID, null, "表单ID", true, true, 0, 100, 10);
map.AddTBString(FrmEventAttr.FK_Flow, null, "流程编号", true, true, 0, 100, 10);
map.AddTBInt(FrmEventAttr.FK_Node, 0, "节点ID", true, true);
//执行内容. EventDoType 0=SQL,1=URL....
map.AddTBInt(FrmEventAttr.EventDoType, 0, "事件执行类型", true, true);
map.AddTBString(FrmEventAttr.FK_DBSrc, "local", "数据源", true, false, 0, 100, 20);
map.AddTBString(FrmEventAttr.DoDoc, null, "执行内容", true, true, 0, 400, 10);
map.AddTBString(FrmEventAttr.MsgOK, null, "成功执行提示", true, true, 0, 400, 10);
map.AddTBString(FrmEventAttr.MsgError, null, "异常信息提示", true, true, 0, 400, 10);
#region 消息设置. 如下属性放入了节点参数信息了.
map.AddDDLSysEnum(FrmEventAttr.MsgCtrl, 0, "消息发送控制", true, true, FrmEventAttr.MsgCtrl,
"@0=不发送@1=按设置的下一步接受人自动发送(默认)@2=由本节点表单系统字段(IsSendEmail,IsSendSMS)来决定@3=由SDK开发者参数(IsSendEmail,IsSendSMS)来决定", true);
map.AddBoolean(FrmEventAttr.MailEnable, true, "是否启用邮件发送?(如果启用就要设置邮件模版支持ccflow表达式。)", true, true, true);
map.AddTBString(FrmEventAttr.MailTitle, null, "邮件标题模版", true, false, 0, 200, 20, true);
map.AddTBStringDoc(FrmEventAttr.MailDoc, null, "邮件内容模版", true, false, true);
//是否启用手机短信?
map.AddBoolean(FrmEventAttr.SMSEnable, false, "是否启用短信发送?(如果启用就要设置短信模版支持ccflow表达式。)", true, true, true);
map.AddTBStringDoc(FrmEventAttr.SMSDoc, null, "短信内容模版", true, false, true);
map.AddBoolean(FrmEventAttr.MobilePushEnable, true, "是否推送到手机、pad端。", true, true, true);
#endregion 消息设置.
#region webApi设置.
//@Get=Get模式@POST=Post模式
map.AddTBString("PostModel", "Get", "请求模式", true, true, 0, 100, 10);
map.AddTBInt("ParaMoel", 0, "参数模式", true, true);//@0=自定义模式@1=全量模式
map.AddTBString("ParaDocs", "0", "自定义数据内容", true, true, 0, 100, 10);//@0=自定义模式@1=全量模式
map.AddTBString("ParaDTModel", "0", "数据格式", true, true, 0, 100, 10);//@0=From@1=JSON
#endregion 消息设置.
//参数属性
map.AddTBAtParas(4000);
this._enMap = map;
return this._enMap;
}
}
#endregion
protected override bool beforeUpdateInsertAction()
{
//设置关联的FlowNo编号,以方便流程删除与模版导入导出.
if (DataType.IsNullOrEmpty(this.FlowNo) == false)
this.RefFlowNo = this.FlowNo;
if (this.NodeID != 0)
this.RefFlowNo = DBAccess.RunSQLReturnString("SELECT FK_Flow FROM WF_Node WHERE NodeID=" + this.NodeID);
if (this.FrmID.StartsWith("ND") == true)
{
string nodeStr = this.FrmID.Replace("ND", "");
if (DataType.IsNumStr(nodeStr) == true)
{
int nodeid = int.Parse(nodeStr);
this.RefFlowNo = DBAccess.RunSQLReturnString("SELECT FK_Flow FROM WF_Node WHERE NodeID=" + nodeid);
}
}
return base.beforeUpdateInsertAction();
}
protected override bool beforeInsert()
{
//在属性实体集合插入前clear父实体的缓存.
if (DataType.IsNullOrEmpty(this.FrmID) == false)
BP.Sys.Base.Glo.ClearMapDataAutoNum(this.FrmID);
return base.beforeInsert();
}
protected override void afterInsertUpdateAction()
{
base.afterInsertUpdateAction();
}
protected override void afterDelete()
{
base.afterDelete();
}
}
/// <summary>
/// 事件
/// </summary>
public class FrmEvents : EntitiesMyPK
{
/// <summary>
/// 执行事件
/// </summary>
/// <param name="dotype">执行类型</param>
/// <param name="en">数据实体</param>
/// <returns>null 没有事件,其他为执行了事件。</returns>
public string DoEventNode(string dotype, Entity en)
{
// return null; // 2019-08-27 取消节点事件 zl
return DoEventNode(dotype, en, null);
}
/// <summary>
/// 执行事件
/// </summary>
/// <param name="dotype">执行类型</param>
/// <param name="en">数据实体</param>
/// <param name="atPara">参数</param>
/// <returns>null 没有事件,其他为执行了事件。</returns>
/// <remarks>
/// 不再使用节点事件 2019-08-27 zl
/// 原调用点有两处1FrmEvent.cs 中的DoEventNode() 2Flow.cs中的DoFlowEventEntity()方法中3973行 fes.DoEventNode(doType, en, atPara)。
/// 现在都已经取消调用
/// </remarks>
public string DoEventNode(string dotype, Entity en, string atPara)
{
if (this.Count == 0)
return null;
string val = _DoEventNode(dotype, en, atPara);
if (val != null)
val = val.Trim();
if (DataType.IsNullOrEmpty(val))
return ""; // 说明有事件,执行成功了。
else
return val; // 没有事件.
}
/// <summary>
/// 执行事件,事件标记是 EventList.
/// </summary>
/// <param name="dotype">执行类型</param>
/// <param name="en">数据实体</param>
/// <param name="atPara">特殊的参数格式@key=value 方式.</param>
/// <returns></returns>
private string _DoEventNode(string dotype, Entity en, string atPara)
{
if (this.Count == 0)
return null;
FrmEvent nev = this.GetEntityByKey(FrmEventAttr.FK_Event, dotype) as FrmEvent;
if (nev == null || nev.HisDoType == EventDoType.Disable)
return null;
#region 执行的是业务单元.
if (nev.HisDoType == EventDoType.BuessUnit)
{
/* 获得业务单元,开始执行他 */
BuessUnitBase enBuesss = BP.Sys.Base.Glo.GetBuessUnitEntityByEnName(nev.DoDoc);
enBuesss.WorkID = Int64.Parse(en.PKVal.ToString());
return enBuesss.DoIt();
}
#endregion 执行的是业务单元.
string doc = nev.DoDoc.Trim();
if ((doc == null || doc == "") && nev.HisDoType != EventDoType.SpecClass) //edited by liuxc,2016-01-16,执行DLL文件不需要判断doc为空
return null;
#region 处理执行内容
Attrs attrs = en.EnMap.Attrs;
string MsgOK = "";
string MsgErr = "";
if (nev.NodeID != 0)
{
doc = doc.Replace("@FK_Node", "" + nev.NodeID);
doc = doc.Replace("@NodeID", "" + nev.NodeID);
}
if (DataType.IsNullOrEmpty(nev.FlowNo) == false)
{
doc = doc.Replace("@FlowNo", "" + nev.FlowNo);
doc = doc.Replace("@FK_Flow", "" + nev.FlowNo);
}
doc = doc.Replace("~", "'");
doc = doc.Replace("@WebUser.No", BP.Web.WebUser.No);
doc = doc.Replace("@WebUser.Name", BP.Web.WebUser.Name);
doc = doc.Replace("@WebUser.FK_Dept", BP.Web.WebUser.DeptNo);
doc = doc.Replace("@FK_Node", nev.FrmID.Replace("ND", ""));
doc = doc.Replace("@FrmID", nev.FrmID);
doc = doc.Replace("@FK_MapData", nev.FrmID);
doc = doc.Replace("@WorkID", en.GetValStrByKey("OID", "@WorkID"));
doc = doc.Replace("@WebUser.OrgNo", BP.Web.WebUser.OrgNo);
if (doc.Contains("@") == true)
{
foreach (Attr attr in attrs)
{
if (doc.Contains("@" + attr.Key) == false)
continue;
doc = doc.Replace("@" + attr.Key, en.GetValStrByKey(attr.Key));
}
}
//替换。
if (DataType.IsNullOrEmpty(atPara) == false && doc.Contains("@") == true)
{
AtPara ap = new AtPara(atPara);
foreach (string key in ap.HisHT.Keys)
{
doc = doc.Replace("@" + key, ap.GetValStrByKey(key));
}
}
//SDK表单上服务器地址,应用到使用ccflow的时候使用的是sdk表单,该表单会存储在其他的服务器上.
doc = doc.Replace("@SDKFromServHost", BP.Difference.SystemConfig.AppSettings["SDKFromServHost"]);
if (doc.Contains("@") == true)
{
if (HttpContextHelper.Current != null)
{
/*如果是 bs 系统, 有可能参数来自于url ,就用url的参数替换它们 .*/
//string url = BP.Sys.Base.Glo.Request.RawUrl;
//2019-07-25 zyt改造
string url = HttpContextHelper.RequestRawUrl;
if (url.IndexOf('?') != -1)
url = url.Substring(url.IndexOf('?')).TrimStart('?');
string[] paras = url.Split('&');
foreach (string s in paras)
{
string[] mys = s.Split('=');
if (doc.Contains("@" + mys[0]) == false)
continue;
doc = doc.Replace("@" + mys[0], mys[1]);
}
}
}
if (nev.HisDoType == EventDoType.URLOfSelf)
{
if (doc.Contains("?") == false)
doc += "?1=2";
doc += "&UserNo=" + WebUser.No;
doc += "&Token=" + WebUser.Token;
doc += "&FK_Dept=" + WebUser.DeptNo;
// doc += "&FK_Unit=" + WebUser.FK_Unit;
doc += "&OID=" + en.PKVal;
if (BP.Difference.SystemConfig.isBSsystem)
{
/*是bs系统并且是url参数执行类型.*/
//2019-07-25 zyt改造
string url = HttpContextHelper.RequestRawUrl;
if (url.IndexOf('?') != -1)
url = url.Substring(url.IndexOf('?')).TrimStart('?');
string[] paras = url.Split('&');
foreach (string s in paras)
{
string[] mys = s.Split('=');
if (doc.Contains(mys[0] + "="))
continue;
doc += "&" + s;
}
doc = doc.Replace("&?", "&");
}
if (BP.Difference.SystemConfig.isBSsystem == false)
{
/*非bs模式下调用,比如在cs模式下调用它,它就取不到参数. */
}
if (doc.StartsWith("http") == false)
{
/*如果没有绝对路径 */
if (BP.Difference.SystemConfig.isBSsystem)
{
/*在cs模式下自动获取*/
//string host = BP.Sys.Base.Glo.Request.Url.Host;
//2019-07-25 zyt改造
string host = HttpContextHelper.RequestUrlHost;
if (doc.Contains("@AppPath"))
doc = doc.Replace("@AppPath", "http://" + host + HttpContextHelper.RequestApplicationPath);
else
doc = "http://" + HttpContextHelper.RequestUrlAuthority + doc;
}
if (BP.Difference.SystemConfig.isBSsystem == false)
{
/*在cs模式下它的baseurl 从web.config中获取.*/
string cfgBaseUrl = BP.Difference.SystemConfig.HostURL;
if (DataType.IsNullOrEmpty(cfgBaseUrl))
{
string err = "调用url失败:没有在web.config中配置BaseUrl,导致url事件不能被执行.";
BP.DA.Log.DebugWriteError(err);
throw new Exception(err);
}
doc = cfgBaseUrl + doc;
}
}
//增加上系统约定的参数.
doc += "&EntityName=" + en.ToString() + "&EntityPK=" + en.PK + "&EntityPKVal=" + en.PKVal + "&FK_Event=" + nev.MyPK;
}
#endregion 处理执行内容
if (atPara != null && doc.Contains("@") == true)
{
AtPara ap = new AtPara(atPara);
foreach (string s in ap.HisHT.Keys)
doc = doc.Replace("@" + s, ap.GetValStrByKey(s));
}
if (dotype == EventListFrm.FrmLoadBefore)
{
string frmType = en.GetParaString("FrmType");
if (DataType.IsNullOrEmpty(frmType) == true || frmType.Equals("DBList") == false)
en.Retrieve(); /*如果不执行,就会造成实体的数据与查询的数据不一致.*/
}
switch (nev.HisDoType)
{
case EventDoType.SP:
case EventDoType.SQL:
//SQLServer数据库中执行带参的存储过程
try
{
if (nev.HisDoType == EventDoType.SP && doc.Contains("=") == true
&& BP.Difference.SystemConfig.AppCenterDBType == DBType.MSSQL)
{
RunSQL(doc);
return nev.MsgOK(en);
}
if (DataType.IsNullOrEmpty(nev.DBSrcNo) == false && nev.DBSrcNo.Equals("local") == false)
{
SFDBSrc sfdb = new SFDBSrc(nev.DBSrcNo);
sfdb.RunSQLs(doc);
}
else
{
// 允许执行带有GO的sql.
DBAccess.RunSQLs(doc);
}
return nev.MsgOK(en);
}
catch (Exception ex)
{
throw new Exception(nev.MsgError(en) + ",异常信息:" + ex.Message);
}
break;
case EventDoType.URLOfSelf:
string myURL = doc.Clone() as string;
if (myURL.Contains("http") == false)
{
if (BP.Difference.SystemConfig.isBSsystem)
{
//string host = BP.Sys.Base.Glo.Request.Url.Host;
//2019-07-25 zyt改造
string host = HttpContextHelper.RequestUrlHost;
if (myURL.Contains("@AppPath"))
myURL = myURL.Replace("@AppPath", "http://" + host + HttpContextHelper.RequestApplicationPath);
else
myURL = "http://" + HttpContextHelper.RequestUrlAuthority + myURL;
}
else
{
string cfgBaseUrl = BP.Difference.SystemConfig.HostURL;
if (DataType.IsNullOrEmpty(cfgBaseUrl))
{
string err = "调用url失败:没有在web.config中配置BaseUrl,导致url事件不能被执行.";
BP.DA.Log.DebugWriteError(err);
throw new Exception(err);
}
myURL = cfgBaseUrl + myURL;
}
}
myURL = myURL.Replace("@SDKFromServHost", BP.Difference.SystemConfig.AppSettings["SDKFromServHost"]);
if (myURL.Contains("&FID=") == false && en.Row.ContainsKey("FID") == true)
{
string str = en.Row["FID"].ToString();
myURL = myURL + "&FID=" + str;
}
if (myURL.Contains("&FK_Flow=") == false && en.Row.ContainsKey("FK_Flow") == true)
{
string str = en.Row["FK_Flow"].ToString();
myURL = myURL + "&FK_Flow=" + str;
}
if (myURL.Contains("&WorkID=") == false)
{
String str = "";
if (en.Row.ContainsKey("WorkID") == true)
{
str = en.Row["WorkID"].ToString();
myURL = myURL + "&WorkID=" + str;
}
else if (en.Row.ContainsKey("OID") == true)
{
str = en.Row["OID"].ToString();
myURL = myURL + "&WorkID=" + str;
}
}
try
{
Encoding encode = System.Text.Encoding.GetEncoding("gb2312");
string text = DataType.ReadURLContext(myURL, 600000, encode);
if (text == null)
throw new Exception("@流程设计错误执行的url错误:" + myURL + ", 返回为null, 请检查url设置是否正确。提示您可以copy出来此url放到浏览器里看看是否被正确执行。");
if (text != null
&& text.Length > 7
&& text.Substring(0, 7).ToLower().Contains("err"))
throw new Exception(text);
if (text == null || text.Trim() == "")
return null;
return text;
}
catch (Exception ex)
{
throw new Exception("@" + nev.MsgError(en) + " Error:" + ex.Message);
}
break;
case EventDoType.EventBase: //执行事件类.
// 获取事件类.
string evName = doc.Clone() as string;
BP.Sys.Base.EventBase ev = null;
try
{
ev = BP.En.ClassFactory.GetEventBase(evName);
}
catch (Exception ex)
{
throw new Exception("@事件名称:" + evName + "拼写错误或者系统不存在。说明事件所在的类库必须是以BP.开头并且类库的BP.xxx.dll。");
}
if (ev == null)
throw new Exception("@事件名称:" + evName + "拼写错误或者系统不存在。说明事件所在的类库必须是以BP.开头并且类库的BP.xxx.dll。");
//开始执行.
try
{
#region 处理整理参数.
Row r = en.Row;
try
{
//系统参数.
r.Add("FK_MapData", en.ClassID);
}
catch
{
r["FK_MapData"] = en.ClassID;
}
try
{
r.Add("EventSource", nev.EventNo);
}
catch
{
r["EventSource"] = nev.EventNo;
}
if (atPara != null)
{
AtPara ap = new AtPara(atPara);
foreach (string s in ap.HisHT.Keys)
{
try
{
r.Add(s, ap.GetValStrByKey(s));
}
catch
{
r[s] = ap.GetValStrByKey(s);
}
}
}
if (BP.Difference.SystemConfig.isBSsystem == true)
{
/*如果是bs系统, 就加入外部url的变量.*/
//2019 - 07 - 25 zyt改造
foreach (string key in HttpContextHelper.RequestParamKeys)
{
string val = HttpContextHelper.RequestParams(key);
try
{
r.Add(key, val);
}
catch
{
r[key] = val;
}
}
}
#endregion 处理整理参数.
ev.SysPara = r;
ev.HisEn = en;
ev.Do();
string str = ev.SucessInfo;
if (str.Contains("err@") == true)
throw new Exception(str);
return str;
}
catch (Exception ex)
{
throw new Exception("@执行事件(" + ev.Title + ")期间出现错误:" + ex.Message);
}
break;
case EventDoType.WebApi:
try
{
string urlExt = doc; //url.
urlExt = BP.Tools.PubGlo.DealExp(urlExt, en);
//增加其他的参数.
if (atPara != null && doc.Contains("@") == true)
{
AtPara ap = new AtPara(atPara);
foreach (string s in ap.HisHT.Keys)
doc = doc.Replace("@" + s, ap.GetValStrByKey(s));
}
string urlUodel = nev.GetValStringByKey("PostModel"); //模式. Post,Get
int paraMode = nev.GetValIntByKey("ParaModel"); //参数模式. 0=自定义模式, 1=全量模式.
string pdocs = nev.GetValStringByKey("ParaDocs"); //参数内容. 对自定义模式有效.
string paraDTModel = nev.GetValStringByKey("ParaDTModel"); //参数内容. 对自定义模式有效.
bool isJson = false;
if (paraDTModel.Equals("1"))
isJson = true;
//全量参数模式.
if (paraMode == 1)
{
pdocs = en.ToJson(false);
}
else
{
pdocs = pdocs.Replace("~", "\"");
pdocs = BP.Tools.PubGlo.DealExp(pdocs, en);
//
if (atPara != null && pdocs.Contains("@") == true)
{
AtPara ap = new AtPara(atPara);
foreach (string s in ap.HisHT.Keys)
pdocs = pdocs.Replace("@" + s, ap.GetValStrByKey(s));
}
if (pdocs.Contains("@") == true)
throw new Exception("@_DoEvent参数不完整:" + pdocs);
}
//判断提交模式.
string result = "";
if (urlUodel.ToLower().Equals("get") == true)
result = DataType.ReadURLContext(urlExt, 9000); //返回字符串.
else
result = BP.Tools.PubGlo.HttpPostConnect(urlExt, pdocs, "POST", isJson);
if (DataType.IsNullOrEmpty(result) == true)
throw new Exception("@执行WebAPI[" + urlExt + "]没有返回结果值");
//数据序列化
JObject jsonData = result.ToJObject();
//code=200表示请求成功否则失败
string msg = jsonData["msg"] != null ? jsonData["msg"].ToString() : "";
if (!jsonData["code"].ToString().Equals("200"))
throw new Exception("@执行WebAPI[" + urlExt + "]失败:" + msg);
return msg;
}
catch (Exception ex)
{
throw new Exception("@" + nev.MsgError(en) + " Error:" + ex.Message);
}
break;
case EventDoType.SFProcedure:
#region 自定义存储过程
SFProcedure procedure = new SFProcedure(doc);
string requestMethod = procedure.GetValStringByKey("RequestMethod");
string expDoc = procedure.GetValStringByKey("ExpDoc");
if (DataType.IsNullOrEmpty(expDoc) == true)
throw new Exception("err@表达式");
SFDBSrc sfdbsrc = new SFDBSrc(procedure.FK_SFDBSrc);
string dbsrcType = sfdbsrc.DBSrcType;
if (dbsrcType.Equals(DBSrcType.WebApi) == true)
{
expDoc = BP.Tools.PubGlo.DealExp(expDoc, en);
if (expDoc.StartsWith("htt") == false)
expDoc = sfdbsrc.ConnString + expDoc;
if (requestMethod.Equals("Get") == true)
return BP.Tools.PubGlo.HttpPostConnect(expDoc, "");
if (requestMethod.Equals("POST") == true)
{
int paraModel = procedure.GetValIntByKey("ParaModel");
if (paraModel == 0)//主表参数
{
}
}
}
return null;
#endregion 自定义存储过程
break;
default:
throw new Exception("@no such way." + nev.HisDoType.ToString());
}
}
/// <summary>
/// 事件
/// </summary>
public FrmEvents()
{
}
/// <summary>
/// 事件
/// </summary>
/// <param name="FK_MapData">FK_MapData</param>
public FrmEvents(string fk_MapData)
{
QueryObject qo = new QueryObject(this);
qo.AddWhere(FrmEventAttr.FrmID, fk_MapData);
qo.DoQuery();
}
/// <summary>
/// 事件
/// </summary>
/// <param name="FK_MapData">按节点ID查询</param>
public FrmEvents(int nodeID)
{
QueryObject qo = new QueryObject(this);
qo.AddWhere(FrmEventAttr.FK_Node, nodeID);
qo.DoQuery();
}
public FrmEvents(int nodeID, string fk_flow)
{
QueryObject qo = new QueryObject(this);
qo.AddWhere(FrmEventAttr.FK_Node, nodeID);
qo.addOr();
qo.addLeftBracket();
qo.AddWhere(FrmEventAttr.FK_Flow, fk_flow);
qo.addAnd();
qo.AddWhere(FrmEventAttr.FK_Node, 0);
qo.addRightBracket();
qo.DoQuery();
}
/// <summary>
/// 得到它的 Entity
/// </summary>
public override Entity GetNewEntity
{
get
{
return new FrmEvent();
}
}
#region 为了适应自动翻译成java的需要,把实体转换成List.
/// <summary>
/// 转化成 java list,C#不能调用.
/// </summary>
/// <returns>List</returns>
public System.Collections.Generic.IList<FrmEvent> ToJavaList()
{
return (System.Collections.Generic.IList<FrmEvent>)this;
}
/// <summary>
/// 转化成list
/// </summary>
/// <returns>List</returns>
public System.Collections.Generic.List<FrmEvent> Tolist()
{
System.Collections.Generic.List<FrmEvent> list = new System.Collections.Generic.List<FrmEvent>();
for (int i = 0; i < this.Count; i++)
{
list.Add((FrmEvent)this[i]);
}
return list;
}
#endregion 为了适应自动翻译成java的需要,把实体转换成List.
}
}