using System; using System.Collections.Generic; using System.Data; using SuperMap.RealEstate.CoreFrameWork; using SuperMap.RealEstate.FrameWork.Business; using SuperMap.RealEstate.Enums; using SuperMap.RealEstate.Plugin; using SuperMap.RealEstate.ServiceModel; using SuperMap.RealEstate.ServiceModel.Enums; using SuperMap.RealEstate.WorkFlow; using SuperMap.RealEstate.WorkFlow.Instance; using SuperMap.RealEstate.WorkFlow.Instance.Business; using Instance = SuperMap.RealEstate.WorkFlow.Instance; using Support = SuperMap.RealEstate.WorkFlow.Support.Business; namespace MobileServicePlatform.Common { /// public partial class InstanceHelper { /// public const string Guid_AcceptProInst = "SR01"; /// public const string Guid_Material = "SR02"; /// public const string Guid_LinkMan = "SR03"; /// public const string Guid_Consignor = "SR04"; ///// //public const string Enum_Certificate_Type_CID = "1001"; /// public const string Enum_Certificate_Type_BusinessLicence = "3001"; #region CreateProInst 创建流程实例,活动实例、当前活动实例 /// /// 创建流程实例,活动实例、当前活动实例 /// /// /// /// public static string CreateProInst(Transaction _Transaction, User _User, string ProDef_ID_Encrypt, string RDivision_Code) { Support.ProDef _ProDef = new Support.ProDef(_Transaction); _ProDef.ProDef_ID_Encrypt = ProDef_ID_Encrypt; if (!_ProDef.Select()) { throw new Exception("流程不存在!"); } List _ActDefCollection = _ProDef.GetActDefCollection(ActDefType.ProcessStart); if (_ActDefCollection.Count == 0) { throw new Exception("流程" + _ProDef.ProDef_Name + "未定义开始节点!"); } else if (_ActDefCollection.Count > 1) { throw new Exception("流程" + _ProDef.ProDef_Name + "定义了多个开始节点!"); } Support.ActDef _ActDef = _ActDefCollection[0]; //判断是否具有权限 Support.UserRole _UserRole = new Support.UserRole(_Transaction); _UserRole.AddSearchParameter("User_ID", _User.User_ID); _UserRole.AddSearchParameter("Role_ID", _ActDef.ActEntDef.Role_ID.Value); if (!_UserRole.Search()) { throw new Exception("您可能无权受理" + _ProDef.ProDef_Name + "!"); } DateTime _DateTime = DateTime.Now; ProInst _ProInst = new ProInst(_Transaction); //复制流程 _ProInst.CopyFrom(_ProDef);//, _ProInst); _ProInst.ProInst_StartDate = DateTime.Now; _ProInst.ProInst_State = ProInstState.Normal; _ProInst.ProInst_Type = ProInstType.Normal; _ProInst.ProInst_StartDate = _DateTime; if (_ProDef.Enabled_Division == 1) { string _Division_Code = RDivision_Code; if (string.IsNullOrEmpty(_Division_Code)) { if (_User.User_CityAuthority.IndexOf(",") < 0) _Division_Code = _User.User_CityAuthority; } if (string.IsNullOrEmpty(_Division_Code)) { throw new Exception("启用城区的流程必须传递城区参数!"); } if (_User.User_EnabledCityAuthority == 1 && !(" " + _User.User_CityAuthority + " ").Contains(" " + _Division_Code + " ")) { throw new Exception("您不具有当前服务区的受理权限!"); } _ProInst.Division_Code_BaseValue = int.Parse(_Division_Code); } _ProInst.ProInst_EndDate = SupportHelper.GetEndDate(_DateTime, _ProDef.ProDef_TimeLimit.Value, _Transaction); if (_ProInst.Department_Code.HasValue) { _ProInst.Department_Name = DictionaryHelper.GetFieldEnumName("Department_Code", _ProInst.Department_Code.ToString(), _Transaction); } _ProInst.Insert(); ActInst _ActInst = new ActInst(_ProInst); _ActInst.CopyFrom(_ProInst);//, _ActInst); _ActInst.CopyFrom(_ActDef);//, _ActInst); _ActInst.ActInst_Name = _ActDef.ActDef_Name; _ActInst.ActInst_PositionX = _ActDef.ActDef_PositionX; _ActInst.ActInst_PositionY = _ActDef.ActDef_PositionY; _ActInst.User_ID = _User.User_ID; _ActInst.User_Name = _User.User_Name; //显示用户归属岗位 UserType _UserType = new UserType(_Transaction); _UserType.UserType_ID = _User.UserType_ID; if (_UserType.Select()) { _ActInst.User_Name += "【" + _UserType.UserType_Name + "】"; } _ActInst.ActInst_State = ActInstState.Normal; _ActInst.ActInst_Type = ActInstType.Accept; _ActInst.ActInst_StartDate = _DateTime; _ActInst.ActInst_WorkDate = _DateTime; _ActInst.Data_PutInStorage = 0; _ActInst.ActInst_EndDate = SupportHelper.GetEndDate(_DateTime, _ActDef.ActDef_TimeLimit.Value, _Transaction); _ActInst.Department_Code = _ActDef.Department_Code; if (_ActInst.Department_Code.HasValue) { _ActInst.Department_Name = DictionaryHelper.GetFieldEnumName("Department_Code", _ActInst.Department_Code.ToString(), _Transaction); } else { _ActInst.Department_Name = ""; } _ActInst.Insert(); _Transaction.LoggingInfo.LogTransaction_Model = LogTransaction_Model.PageWorkFlow.ToInt16(); _Transaction.LoggingInfo.LogTransaction_Name = LogTransaction_Model.PageWorkFlow.ToDescription() + "_" + _ProInst.ProDef_Name; _Transaction.LoggingInfo.LogTransaction_KeyValue = "";//.Value.ToString(); _Transaction.LoggingInfo.ProInst_ID = _ProInst.ProInst_ID.Value; _Transaction.LoggingInfo.ActInst_ID = _ActInst.ActInst_ID; _Transaction.LoggingInfo.ActInst_Name = _ActInst.ActInst_Name; _Transaction.LoggingInfo.Component_ID = LoggingInfoDefaultState.Init.ToInt32(); _Transaction.LoggingInfo.Component_Name = LoggingInfoDefaultState.Init.ToDescription(); _ProInst.ServiceClient.UpdateLogTransaction(_Transaction.LoggingInfo); NowActInst _NowActInst = new NowActInst(_Transaction); _NowActInst.CopyFrom(_ActInst); _NowActInst.CopyFrom(_ProInst); _NowActInst.Role_ID = _ActDef.ActEntDef.Role_ID; _NowActInst.NowActInst_Locked = 1; _NowActInst.Insert(); _Transaction.AutoCommit(); return _NowActInst.ProInst_ID.ToEncrypt(); } /// /// 创建流程实例,活动实例、当前活动实例 /// /// /// /// /// 流程名称自定义 /// 是否创建受理号 /// 是否提交事务 /// /// public static NowActInst CreateProInst(User _User, string ProDef_ID_Encrypt, out string ProInst_ID_Encrypt, string ProInst_Name = "", bool CreateProinstCode = true, bool AutoCommit = true, Transaction _Transaction = null) { //if (_Transaction != null) // Page.Transaction = _Transaction; //else // Page.Transaction = new Transaction(); ProInst_ID_Encrypt = ""; Support.ProDef _ProDef = new Support.ProDef(_Transaction); _ProDef.ProDef_ID_Encrypt = ProDef_ID_Encrypt; if (!_ProDef.Select()) { throw new Exception("流程不存在!"); } List _ActDefCollection = _ProDef.GetActDefCollection(ActDefType.ProcessStart); if (_ActDefCollection.Count == 0) { throw new Exception("流程" + _ProDef.ProDef_Name + "未定义开始节点!"); } else if (_ActDefCollection.Count > 1) { throw new Exception("流程" + _ProDef.ProDef_Name + "定义了多个开始节点!"); } Support.ActDef _ActDef = _ActDefCollection[0]; //判断是否具有权限 Support.UserRole _UserRole = new Support.UserRole(_Transaction); _UserRole.AddSearchParameter("User_ID", _User.User_ID); _UserRole.AddSearchParameter("Role_ID", _ActDef.ActEntDef.Role_ID.Value); if (!_UserRole.Search()) { throw new Exception("您可能无权受理" + _ProDef.ProDef_Name + "!"); } DateTime _DateTime = DateTime.Now; ProInst _ProInst = new ProInst(_Transaction); //复制流程 _ProInst.CopyFrom(_ProDef);//, _ProInst); _ProInst.ProInst_Name = ProInst_Name; _ProInst.ProInst_StartDate = DateTime.Now; _ProInst.ProInst_State = ProInstState.Normal; _ProInst.ProInst_Type = ProInstType.Normal; _ProInst.ProInst_StartDate = _DateTime; _ProInst.ProInst_EndDate = SupportHelper.GetEndDate(_DateTime, _ProDef.ProDef_TimeLimit.Value, _Transaction); if (_ProInst.Department_Code.HasValue) { try { //这里枚举不知道是什么问题 _ProInst.Department_Name = DictionaryHelper.GetFieldEnumName("Department_Code", _ProInst.Department_Code.ToString(), _Transaction); } catch { } } if (CreateProinstCode) { _ProInst.ProInst_Code = CreateAcceptCode(_ProInst); } _ProInst.Insert(); ProInst_ID_Encrypt = _ProInst.ProInst_ID_Encrypt; ActInst _ActInst = new ActInst(_ProInst); _ActInst.CopyFrom(_ProInst);//, _ActInst); _ActInst.CopyFrom(_ActDef);//, _ActInst); _ActInst.ActInst_Name = _ActDef.ActDef_Name; _ActInst.ActInst_PositionX = _ActDef.ActDef_PositionX; _ActInst.ActInst_PositionY = _ActDef.ActDef_PositionY; _ActInst.User_ID = _User.User_ID; _ActInst.User_Name = _User.User_Name; //显示用户归属岗位 UserType _UserType = new UserType(_Transaction); _UserType.UserType_ID = _User.UserType_ID; if (_UserType.Select()) { _ActInst.User_Name += "【" + _UserType.UserType_Name + "】"; } _ActInst.ActInst_State = ActInstState.Normal; _ActInst.ActInst_Type = ActInstType.Accept; _ActInst.ActInst_StartDate = _DateTime; _ActInst.ActInst_WorkDate = _DateTime; _ActInst.Data_PutInStorage = 0; _ActInst.ActInst_EndDate = SupportHelper.GetEndDate(_DateTime, _ActDef.ActDef_TimeLimit.Value, _Transaction); _ActInst.Department_Code = _ActDef.Department_Code; if (_ActInst.Department_Code.HasValue) { _ActInst.Department_Name = DictionaryHelper.GetFieldEnumName("Department_Code", _ActInst.Department_Code.ToString(), _Transaction); } else { _ActInst.Department_Name = ""; } _ActInst.Insert(); _Transaction.LoggingInfo.LogTransaction_Model = LogTransaction_Model.PageWorkFlow.ToInt16(); _Transaction.LoggingInfo.LogTransaction_Name = LogTransaction_Model.PageWorkFlow.ToDescription() + "_" + _ProInst.ProDef_Name; _Transaction.LoggingInfo.LogTransaction_KeyValue = "";//.Value.ToString(); //Page.Transaction.LoggingInfo.Modify_LogTransaction_KeyValue = true; _Transaction.LoggingInfo.ProInst_ID = _ProInst.ProInst_ID.Value; _Transaction.LoggingInfo.ActInst_ID = _ActInst.ActInst_ID; _Transaction.LoggingInfo.ActInst_Name = _ActInst.ActInst_Name; _Transaction.LoggingInfo.Component_ID = LoggingInfoDefaultState.Init.ToInt32(); _Transaction.LoggingInfo.Component_Name = LoggingInfoDefaultState.Init.ToDescription(); _ProInst.ServiceClient.UpdateLogTransaction(_Transaction.LoggingInfo); NowActInst _NowActInst = new NowActInst(_Transaction); _NowActInst.CopyFrom(_ActInst); _NowActInst.CopyFrom(_ProInst); _NowActInst.Role_ID = _ActDef.ActEntDef.Role_ID; _NowActInst.NowActInst_Locked = 1; _NowActInst.Insert(); if (AutoCommit) { _Transaction.AutoCommit(); } return _NowActInst; } #endregion #region CreateAcceptCode 创建受理编号 /// /// 创建受理编号 /// /// /// public static string CreateAcceptCode(ProInst proInst) { if (!string.IsNullOrEmpty(proInst.ProInst_Code)) { if (proInst.ProDef.ProCode_Type == 0) { return EnumHelper.ToValue(proInst.ProInst_Type) + proInst.ProInst_Code.Substring(proInst.ProInst_Code.IndexOf("-")); } else { return EnumHelper.ToValue(proInst.ProInst_Type) + proInst.ProDef.ProCode_Type.ToString() + proInst.ProInst_Code.Substring(proInst.ProInst_Code.IndexOf("-")); } } DateTime _Date = DateTime.Now.Date; List _Result = new List(); string _SequenceValue = string.Empty; int _SequenceFixLength = 0; if (proInst.ProDef.ProCode_Type == 0) { //全局模式不显示 //办件类型 _Result.Add(EnumHelper.ToValue(proInst.ProInst_Type)); } else { //办件类型+编号类型(私有) _Result.Add(EnumHelper.ToValue(proInst.ProInst_Type) + proInst.ProDef.ProCode_Type.ToString()); } string _SequenceName = "seq_code"; if (proInst.ProDef.ProCode_Type.Value == 0) { //全局编号模式 _SequenceName += "_glb_full"; if (proInst.ProDef.ProCode_Mode.Value == 0) //预留无区分分类补齐 _SequenceFixLength = proInst.Operation_Type_BaseValue.ToString().Length + 1; else if (proInst.ProDef.ProCode_Mode.Value == 1) //添加业务类型 _SequenceValue = proInst.Operation_Type_BaseValue.ToString(); else if (proInst.ProDef.ProCode_Mode.Value == 2) //添加流程内码 _SequenceValue = proInst.ProDef_ID.ToString(); else throw new Exception("错误的编号呈现类型"); if (!string.IsNullOrEmpty(_SequenceValue)) { if (proInst.ProDef.ProCode_Completed == 1) { _SequenceValue = _SequenceValue.PadLeft(proInst.Operation_Type_BaseValue.ToString().Length, '0'); } _Result.Add(_SequenceValue); } } else if (proInst.ProDef.ProCode_Type.Value == 1) { //私有编号模式 _SequenceName += "_prv"; if (proInst.ProDef.ProCode_Mode.Value == 0) { _SequenceName += "_full"; //预留无区分分类补齐 _SequenceFixLength = proInst.Operation_Type_BaseValue.ToString().Length + 1; } else if (proInst.ProDef.ProCode_Mode.Value == 1) { _SequenceName += "_oprt"; //添加业务类型 _SequenceValue = proInst.Operation_Type_BaseValue.ToString(); } else if (proInst.ProDef.ProCode_Mode.Value == 2) { _SequenceName += "_prdf"; //添加流程内码 _SequenceValue = proInst.ProDef_ID.ToString(); } else throw new Exception("错误的编号呈现类型"); if (!string.IsNullOrEmpty(_SequenceValue)) { if (proInst.ProDef.ProCode_Completed == 1) { _SequenceValue = _SequenceValue.PadLeft(proInst.Operation_Type_BaseValue.ToString().Length, '0'); } _Result.Add(_SequenceValue); } } else throw new Exception("错误的收件编号类型"); if (proInst.ProDef.ProCode_ResetCycle.Value == 0) { //不重置 _SequenceName += "00000"; _Result.Add(_Date.ToString("yyyy")); } else if (proInst.ProDef.ProCode_ResetCycle.Value == 1) { //年度重置 _SequenceName += "_" + _Date.ToString("yy") + "000"; _Result.Add(_Date.ToString("yyyy")); } else if (proInst.ProDef.ProCode_ResetCycle.Value == 2) { //季度重置 _SequenceName += "_" + _Date.ToString("yy") + "" + (Math.Floor((_Date.Month - 1) / 3.0) + 1) + "00"; _Result.Add(_Date.ToString("yyyy") + (Math.Floor((_Date.Month - 1) / 3.0) + 1)); } else if (proInst.ProDef.ProCode_ResetCycle.Value == 3) { //月度重置 _SequenceName += "_" + _Date.ToString("yy") + "" + (Math.Floor((_Date.Month - 1) / 3.0) + 1) + "" + _Date.ToString("MM"); _Result.Add(_Date.ToString("yyyy") + (Math.Floor((_Date.Month - 1) / 3.0) + 1) + _Date.ToString("MM")); } else throw new Exception("错误的编号重置周期"); try { _SequenceValue = proInst.ExecuteDataTable("select " + _SequenceName + ".nextval from dual").Rows[0][0].ToString(); } catch (Exception ex) { //如果序列不存在,自动创建序列 if (ex.Message.StartsWith("ORA-02289")) { proInst.ServiceClient.ExecuteNonQuery("CREATE SEQUENCE " + _SequenceName + " INCREMENT BY 1 START WITH 1 NOMAXVALUE NOMINVALUE NOCYCLE CACHE 5 NOORDER ", null); _SequenceValue = proInst.ExecuteDataTable("select " + _SequenceName + ".nextval from dual").Rows[0][0].ToString(); } else throw ex; } if (proInst.ProDef.ProCode_Completed == 1) { //开始补齐 if (_SequenceValue.Length < 4) _SequenceValue = _SequenceValue.PadLeft(4, '0'); if (proInst.ProDef.ProCode_ResetCycle.Value == 0) //无区分类型,不重置状态下补齐 _SequenceValue = _SequenceValue.PadLeft("1011234".Length, '0'); } if (proInst.ProDef.ProCode_ResetCycle.Value == 1) _SequenceValue = _SequenceValue.PadLeft("1011234".Length, '0'); else if (proInst.ProDef.ProCode_ResetCycle.Value == 2) _SequenceValue = _SequenceValue.PadLeft("011234".Length, '0'); else if (proInst.ProDef.ProCode_ResetCycle.Value == 3) _SequenceValue = _SequenceValue.PadLeft("1234".Length, '0'); _Result.Add(_SequenceValue); return string.Join("-", _Result.ToArray());// ProDateTime + "-" + ProInst_Type + "-" + _SequenceName; } #endregion #region CheckOverRulePutInStorage 回退业务入库标志检查 /// /// /// /// /// /// public static bool CheckOverRulePutInStorage(NowActInst SourceNowActInst, long ToActInst_ID) { //非当前活动实例的其他实例 //+ " or ActInst_ID != " + ToActInst_ID + ")"); DataTable _DataTable = SourceNowActInst.ExecuteDataTable("select NowActInst_ID,ActDef_ID from T_NowActInst where ProInst_ID = " + SourceNowActInst.ProInst_ID.Value + " and NowActInst_ID !=" + SourceNowActInst.NowActInst_ID.Value); ActInst _ToActInst = new ActInst(SourceNowActInst); _ToActInst.ActInst_ID = ToActInst_ID; if (!_ToActInst.Select()) { throw new Exception("目标环节不存在!"); } NowActInst _OverRuleNowActInst; foreach (DataRow _DataRow in _DataTable.Rows) { _OverRuleNowActInst = new NowActInst(_DataRow, SourceNowActInst); if (!_OverRuleNowActInst.Select()) { continue; } if (CheckNextActDef(SourceNowActInst.ProDef.RouteCollection, _ToActInst.ActDef_ID.Value, SourceNowActInst.ActDef_ID.Value) && CheckNextActDef(SourceNowActInst.ProDef.RouteCollection, _ToActInst.ActDef_ID.Value, (int)_DataRow["ActDef_ID"])) { if (!_OverRuleNowActInst.ActInst_ID.HasValue) { _OverRuleNowActInst.ActInst_ID = long.Parse(_OverRuleNowActInst.ActInst_Name); } if (SourceNowActInst.Data_PutInStorage == 1 && _OverRuleNowActInst.ActInst.Data_PutInStorage == 0) { return true; } } } return false; } #endregion #region OverRule 回退业务 /// /// 如果返回true,就是要处理入库 /// /// /// /// /// public static bool OverRule(NowActInst SourceNowActInst, long ToActInst_ID, ref string Message) { //判断目标活动的定义是否存在 ActInst _ToActInst = new ActInst(SourceNowActInst); _ToActInst.ActInst_ID = ToActInst_ID; if (!_ToActInst.Select()) { throw new Exception("目标环节不存在!"); } if (_ToActInst.ActDef == null) { throw new Exception("目标环节定义信息不存在!"); } //非当前活动实例的其他实例 //+ " or ActInst_ID != " + ToActInst_ID + ")"); DataTable _DataTable = SourceNowActInst.ExecuteDataTable("select NowActInst_ID,ActDef_ID from T_NowActInst where ProInst_ID = " + SourceNowActInst.ProInst_ID.Value + " and NowActInst_ID !=" + SourceNowActInst.NowActInst_ID.Value); DateTime _DateTime = DateTime.Now; //写入活动实例数据 SourceNowActInst.ActInst.CopyFrom(SourceNowActInst); SourceNowActInst.ActInst.ActInst_FinishDate = _DateTime; SourceNowActInst.ActInst.Data_PutInStorage = SourceNowActInst.ProInst.Data_PutInStorage; SourceNowActInst.ActInst.ActInst_Type = ActInstType.OverRule; SourceNowActInst.ActInst.ActInst_Desc = "回退到「" + _ToActInst.ActInst_Name + "」给「" + _ToActInst.User_Name + "」"; SourceNowActInst.ActInst.Update(); NowActInst _NowActInst = new NowActInst(SourceNowActInst); ActInst _ActInst = new ActInst(SourceNowActInst); _NowActInst.AddSearchParameter("ActInst_ID", ToActInst_ID); _NowActInst.AddSearchParameter("ProInst_ID", SourceNowActInst.ProInst_ID); if (!_NowActInst.Search()) { //开始写入转出的数据 _ActInst.CopyFrom(_ToActInst); //_ActInst.CopyFrom(_ToActInst.ActDef, false); //ObjectHelper.Copy(_ToActInst, _ActInst); _ActInst.ActInst_State = ActInstState.OverRule; //判断是否为受理 if (_ToActInst.ActDef_Type == SuperMap.RealEstate.Enums.ActDefType.ProcessStart) { _ActInst.ActInst_Type = ActInstType.Accept; } else { _ActInst.ActInst_Type = ActInstType.Transaction; } _ActInst.ActInst_StartDate = _DateTime; _ActInst.ActInst_EndDate = SupportHelper.GetEndDate(_DateTime, _ToActInst.ActDef.ActDef_TimeLimit.Value, _ActInst.Transaction); _ActInst.Enabled_Statistics = SourceNowActInst.ProInst.Enabled_Statistics; _ActInst.Data_PutInStorage = SourceNowActInst.ProInst.Data_PutInStorage; _ActInst.ActInst_ID = null; //_ActInst.User_ID = _ToActInst.User_ID; //_ActInst.User_Name = _ToActInst.User_Name; _ActInst.Insert(); //插入路由 Route _RouteInst = new Route(SourceNowActInst); _RouteInst.Route_Name = "回退";// "回退到" + _ActInst.ActInst_Name; _RouteInst.ActInst_ID = SourceNowActInst.ActInst.ActInst_ID; _RouteInst.NextActInst_ID = _ActInst.ActInst_ID; _RouteInst.ProInst_ID = SourceNowActInst.ProInst_ID; _RouteInst.Insert(); //插入当前实例 _NowActInst.ResetProperty(); //_NowActInst.CopyFrom(SourceNowActInst.ProInst); //_NowActInst.CopyFrom(_ActInst, false); _NowActInst.CopyFrom(SourceNowActInst.ProInst); _NowActInst.CopyFrom(_ActInst); _NowActInst.Role_ID = _ToActInst.ActDef.ActEntDef.Role_ID; _NowActInst.FromActInst_ID = SourceNowActInst.ActInst_ID.Value; _NowActInst.FromUser_ID = SourceNowActInst.User_ID; _NowActInst.FromUser_Name = SourceNowActInst.User_Name; //_NowActInst.NowActInst_Desc = SourceNowActInst.User_Name + "从「" + SourceNowActInst.ActInst.ActInst_Name + "」回退给您「" + _DateTime.ToString("MM-dd HH:mm") + "」;\r\n"; _NowActInst.NowActInst_Desc = "「" + _DateTime.ToString("MM-dd HH:mm") + "」由「" + SourceNowActInst.User_Name + "」从「" + SourceNowActInst.ActInst.ActInst_Name + "」回退;\r\n"; _NowActInst.Data_PutInStorage = SourceNowActInst.ProInst.Data_PutInStorage; _NowActInst.NowActInst_ID = null; _NowActInst.Insert(); } else { _ActInst.Select(ToActInst_ID); _ActInst.Data_PutInStorage = SourceNowActInst.ProInst.Data_PutInStorage; _ActInst.Update(); //插入路由 Route _RouteInst = new Route(SourceNowActInst); _RouteInst.Route_Name = "回退";// "回退到" + _ActInst.ActInst_Name; _RouteInst.ActInst_ID = SourceNowActInst.ActInst.ActInst_ID; _RouteInst.NextActInst_ID = _ActInst.ActInst_ID; _RouteInst.ProInst_ID = SourceNowActInst.ProInst_ID; _RouteInst.Insert(); //更新当前实例 //_NowActInst.NowActInst_Desc += SourceNowActInst.User_Name + "从「" + SourceNowActInst.ActInst.ActInst_Name + // "」回退给您「" + _DateTime.ToString("MM-dd HH:mm") + "」;\r\n"; _NowActInst.NowActInst_Desc += "「" + _DateTime.ToString("MM-dd HH:mm") + "」由「" + SourceNowActInst.User_Name + "」从「" + SourceNowActInst.ActInst.ActInst_Name + "」回退;\r\n"; _NowActInst.Data_PutInStorage = SourceNowActInst.ProInst.Data_PutInStorage; _NowActInst.Update(); for (int i = _DataTable.Rows.Count - 1; i >= 0; i--) { if ((int)_DataTable.Rows[i]["NowActInst_ID"] == _NowActInst.NowActInst_ID.Value) { _DataTable.Rows.RemoveAt(i); break; } } } if (_DataTable.Rows.Count == 0) { return false; } bool _result = false; //List ListActDefID = new List(); //ListActDefID.Add(_DataTable.Rows.Count.ToString()); //处理并发的其他支线的业务回退 NowActInst _OverRuleNowActInst; foreach (DataRow _DataRow in _DataTable.Rows) { _OverRuleNowActInst = new NowActInst(_DataRow, SourceNowActInst); if (!_OverRuleNowActInst.Select()) continue; if (CheckNextActDef(_NowActInst.ProDef.RouteCollection, _ToActInst.ActDef_ID.Value, SourceNowActInst.ActDef_ID.Value) && CheckNextActDef(_NowActInst.ProDef.RouteCollection, _ToActInst.ActDef_ID.Value, (int)_DataRow["ActDef_ID"])) { if (!_OverRuleNowActInst.ActInst_ID.HasValue) { _OverRuleNowActInst.ActInst_ID = long.Parse(_OverRuleNowActInst.ActInst_Name); _OverRuleNowActInst.ActInst.ActInst_Desc += _DateTime.ToString("MM月dd日HH点mm分") + " 由「" + SourceNowActInst.User_Name + "」在「" + SourceNowActInst.ActInst.ActInst_Name + "」强制回退到「" + _ActInst.ActInst_Name + "」给「" + _ActInst.User_Name + "」"; //ListActDefID.Add("ActInst_ID:"+_OverRuleNowActInst.ActInst_ID.ToString()); } else { _OverRuleNowActInst.ActInst.CopyFrom(_OverRuleNowActInst); _OverRuleNowActInst.ActInst.ActInst_Desc = _DateTime.ToString("MM月dd日HH点mm分") + " 由「" + SourceNowActInst.User_Name + "」在「" + SourceNowActInst.ActInst.ActInst_Name + "」强制回退到「" + _ActInst.ActInst_Name + "」给「" + _ActInst.User_Name + "」"; } Message += "\r\n强制回退「" + _OverRuleNowActInst.ActInst.ActInst_Name + "」到「" + _ActInst.ActInst_Name + "」;"; _OverRuleNowActInst.ActInst.ActInst_Type = ActInstType.OverRule; _OverRuleNowActInst.ActInst.Update(); ////插入路由 Route _RouteInst = new Route(SourceNowActInst); _RouteInst.Route_Name = "强制回退";// "回退到" + _ActInst.ActInst_Name; _RouteInst.ActInst_ID = _OverRuleNowActInst.ActInst_ID; _RouteInst.NextActInst_ID = _ActInst.ActInst_ID; _RouteInst.ProInst_ID = SourceNowActInst.ProInst_ID; _RouteInst.Insert(); //ListActDefID.Add(_OverRuleNowActInst.ActInst.ActInst_Name); _OverRuleNowActInst.Delete(); _result = true; } } return _result; //throw new Exception(string.Join(",", ListActDefID.ToArray())); } private static bool CheckNextActDef(List RouteCollection, int FromActDef_ID, int ToActDef_ID) { foreach (Support.Route _Route in RouteCollection) { if (_Route.ActDef_ID != FromActDef_ID) continue; if (_Route.NextActDef_ID == ToActDef_ID) { return true; } else { if (CheckNextActDef(RouteCollection, _Route.NextActDef_ID.Value, ToActDef_ID))//, ref CurrActDef)) return true; } } return false; } #endregion #region TurnOver 移交业务 /// /// 移交业务 /// /// /// /// /// public static NowActInst TurnOver(NowActInst SourceNowActInst, string User_ID, string User_Name) { //创建一个新的活动实例 ActInst _ActInst = new ActInst(SourceNowActInst); DateTime _DateTime = DateTime.Now; _ActInst.CopyFrom(SourceNowActInst.ActInst); _ActInst.ActInst_ID = null; _ActInst.ActInst_State = ActInstState.TurnOver; _ActInst.ActInst_StartDate = _DateTime; _ActInst.ActInst_WorkDate = _DateTime; //是否需要重置理论办结时间 _ActInst.ActInst_EndDate = SupportHelper.GetEndDate(_DateTime, SourceNowActInst.ActDef.ActDef_TimeLimit.Value, _ActInst.Transaction); _ActInst.User_ID = int.Parse(User_ID); _ActInst.User_Name = User_Name; _ActInst.ActInst_State = ActInstState.TurnOver; _ActInst.ActInst_Desc = ""; _ActInst.Insert(); //创建一个新的当前活动实例 NowActInst _NowActInst = new NowActInst(SourceNowActInst); _NowActInst.CopyFrom(SourceNowActInst.ProInst); _NowActInst.CopyFrom(_ActInst); _NowActInst.User_ID = int.Parse(User_ID); _NowActInst.User_Name = User_Name; //ObjectHelper.Copy(SourceNowActInst.ProDef, _NowActInst); _NowActInst.Role_ID = SourceNowActInst.Role_ID; _NowActInst.NowActInst_ID = null; _NowActInst.NowActInst_Desc = SourceNowActInst.User_Name + "移交给您「" + _DateTime.ToString("MM-dd HH:mm") + "」。"; _NowActInst.Insert(); //写入办结的活动实例内容 SourceNowActInst.ActInst.ActInst_FinishDate = _DateTime; SourceNowActInst.ActInst.ActInst_Type = ActInstType.TurnOver; SourceNowActInst.ActInst.ActInst_Desc = "移交给「" + User_Name + "」"; SourceNowActInst.ActInst.Update(); //写入路由 Route _Route = new Route(SourceNowActInst); _Route.ActInst_ID = SourceNowActInst.ActInst_ID; _Route.ProInst_ID = SourceNowActInst.ProInst_ID; _Route.NextActInst_ID = _ActInst.ActInst_ID; _Route.Route_Name = "移交"; _Route.Route_Value = "移交";// "移交到" + _ActInst.ActInst_Name; //_Route.Route_Value _Route.Insert(); ////删除当前活动实例 //SourceNowActInst.Delete(); return _NowActInst; } #endregion #region Transfer 转出业务 /// public static void Transfer(NowActInst SourceNowActInst, string NextActDef_ID_Encrypt, string User_ID, string User_Name, ActDefType SourceActDefType) { if (SourceNowActInst.ActDef.RouteCollection.Count != 1) throw new Exception("转出路由数量不正确,应该为一个路由条件。"); Support.ActDef _ActDef = new Support.ActDef(SourceNowActInst); _ActDef.ActDef_ID_Encrypt = NextActDef_ID_Encrypt; if (!_ActDef.Select()) { throw new Exception("无法获取定义的活动信息。"); } NowActInst _NowActInst; ActInst _ActInst; Route _RouteInst; //int _User_ID = -1; //if (!string.IsNullOrEmpty(User_ID)) // _User_ID = User_ID.ToDecryptInt32();// int.Parse(StringHelper.Decrypt(User_ID)); ActDefType _ActDefType = (ActDefType)Enum.Parse(typeof(ActDefType), _ActDef.ActDef_Type.Value.ToString()); DateTime _DateTime = DateTime.Now; switch (_ActDefType) { case ActDefType.ActivityMerge: //写入活动实例数据 SourceNowActInst.ActInst.CopyFrom(SourceNowActInst); SourceNowActInst.ActInst.ActInst_FinishDate = _DateTime; SourceNowActInst.ActInst.ActInst_Type = ActInstType.Transfer; //入库数据状态 SourceNowActInst.ActInst.Data_PutInStorage = SourceNowActInst.ProInst.Data_PutInStorage; SourceNowActInst.ActInst.Update(); //插入等待汇合的当前实例 _NowActInst = new NowActInst(SourceNowActInst); _NowActInst.CopyFrom(SourceNowActInst.ProInst); _NowActInst.CopyFrom(_ActDef); _NowActInst.CopyFrom(SourceNowActInst.ProDef); //_NowActInst.Role_ID = _ActDef.ActEntDef.Role_ID; //_NowActInst.ActInst_ID = SourceNowActInst.ActInst_ID; _NowActInst.NowActInst_ID = null; _NowActInst.FromActInst_ID = SourceNowActInst.ActInst_ID.Value;//.ToString(); _NowActInst.FromUser_ID = SourceNowActInst.User_ID; _NowActInst.FromUser_Name = SourceNowActInst.User_Name; _NowActInst.Data_PutInStorage = SourceNowActInst.ProInst.Data_PutInStorage; //临时存储下ActInst_ID _NowActInst.ActInst_Name = SourceNowActInst.ActInst_ID.Value.ToString(); _NowActInst.Insert(); break; case ActDefType.Activity: //写入活动实例数据 SourceNowActInst.ActInst.CopyFrom(SourceNowActInst); SourceNowActInst.ActInst.ActInst_FinishDate = _DateTime; SourceNowActInst.ActInst.ActInst_Type = ActInstType.Transfer; SourceNowActInst.ActInst.Data_PutInStorage = SourceNowActInst.ProInst.Data_PutInStorage; SourceNowActInst.ActInst.Update(); //开始写入转出的数据 _ActInst = new ActInst(SourceNowActInst); string userIdArr = User_ID.ToDecrypt(); if (!string.IsNullOrEmpty(userIdArr)) { for (int i = 0; i < userIdArr.Split(",").Length; i++) { _ActInst.ResetProperty(); _ActInst.CopyFrom(_ActDef); _ActInst.ProInst_ID = SourceNowActInst.ProInst_ID; _ActInst.ActInst_Name = _ActDef.ActDef_Name; _ActInst.ActInst_PositionX = _ActDef.ActDef_PositionX; _ActInst.ActInst_PositionY = _ActDef.ActDef_PositionY; _ActInst.ActInst_StartDate = DateTime.Now; _ActInst.ActInst_State = ActInstState.Normal; _ActInst.ActInst_Type = ActInstType.Transaction; _ActInst.ActInst_StartDate = _DateTime; _ActInst.ActInst_EndDate = SupportHelper.GetEndDate(_DateTime, _ActDef.ActDef_TimeLimit.Value, _ActInst.Transaction); _ActInst.Enabled_Statistics = SourceNowActInst.ProInst.Enabled_Statistics; _ActInst.Data_PutInStorage = SourceNowActInst.ProInst.Data_PutInStorage; _ActInst.ActInst_ID = null; //if (_User_ID > -1) //{ // _ActInst.User_ID = _User_ID; // _ActInst.User_Name = User_Name; //} _ActInst.User_ID = Convert.ToInt32(userIdArr.Split(",")[i]); _ActInst.User_Name = User_Name.Split(",")[i]; _ActInst.Insert(); } } //插入路由 _RouteInst = new Route(SourceNowActInst); //_RouteInst.Route_Name = "转出到" + _ActInst.ActInst_Name; _RouteInst.ActInst_ID = SourceNowActInst.ActInst_ID; _RouteInst.NextActInst_ID = _ActInst.ActInst_ID; _RouteInst.ProInst_ID = SourceNowActInst.ProInst_ID; _RouteInst.Insert(); //插入等待中的汇合路由 if (SourceActDefType == ActDefType.ActivityMerge) { List _NowActInstMergeCollection = SourceNowActInst.FillCollection( "where ActDef_ID = " + SourceNowActInst.ActDef.RouteCollection[0].NextActDef_ID.Value + " and ProInst_ID=" + SourceNowActInst.ProInst_ID.Value.ToString()); NowActInst _NowActInstMerge = null; Route _RouteMerge = null; for (int i = _NowActInstMergeCollection.Count - 1; i >= 0; i--) { _NowActInstMerge = _NowActInstMergeCollection[i]; _RouteMerge = new Route(SourceNowActInst); _RouteMerge.ActInst_ID = long.Parse(_NowActInstMerge.ActInst_Name); //_RouteMerge.Route_Name = "转出到" + _ActInst.ActInst_Name; _RouteMerge.NextActInst_ID = _ActInst.ActInst_ID; _RouteMerge.ProInst_ID = SourceNowActInst.ProInst_ID; _RouteMerge.Insert(); _NowActInstMerge.Delete(); } } //插入当前实例 _NowActInst = new NowActInst(SourceNowActInst); _NowActInst.CopyFrom(SourceNowActInst.ProInst); _NowActInst.CopyFrom(_ActInst); _NowActInst.CopyFrom(SourceNowActInst.ProDef); _NowActInst.Role_ID = _ActDef.ActEntDef.Role_ID; _NowActInst.NowActInst_ID = null; _NowActInst.FromActInst_ID = SourceNowActInst.ActInst_ID.Value;//.ToString(); _NowActInst.FromUser_ID = SourceNowActInst.User_ID; _NowActInst.FromUser_Name = SourceNowActInst.User_Name; _NowActInst.Data_PutInStorage = SourceNowActInst.ProInst.Data_PutInStorage; _NowActInst.Insert(); break; case ActDefType.ProcessEnd: //写入活动实例 SourceNowActInst.ActInst.CopyFrom(SourceNowActInst); SourceNowActInst.ActInst.ActInst_FinishDate = _DateTime; SourceNowActInst.ActInst.ActInst_Type = ActInstType.Transfer; SourceNowActInst.ActInst.Data_PutInStorage = SourceNowActInst.ProInst.Data_PutInStorage; SourceNowActInst.ActInst.Update(); //创建办结实例 _ActInst = new ActInst(SourceNowActInst); _ActInst.CopyFrom(_ActDef); _ActInst.ProInst_ID = SourceNowActInst.ProInst_ID; _ActInst.ActInst_Name = _ActDef.ActDef_Name; _ActInst.ActInst_PositionX = _ActDef.ActDef_PositionX; _ActInst.ActInst_PositionY = _ActDef.ActDef_PositionY; _ActInst.ActInst_State = ActInstState.Normal; _ActInst.ActInst_Type = ActInstType.Transfer; _ActInst.ActInst_StartDate = _DateTime; _ActInst.ActInst_FinishDate = _DateTime; _ActInst.ActInst_WorkDate = _DateTime; _ActInst.ActInst_EndDate = _DateTime; _ActInst.Enabled_Statistics = 0; _ActInst.Data_PutInStorage = SourceNowActInst.ProInst.Data_PutInStorage; _ActInst.ActInst_ID = null; _ActInst.Insert(); //插入路由 _RouteInst = new Route(SourceNowActInst); //_RouteInst.Route_Name = "转出到" + _ActInst.ActInst_Name; _RouteInst.ActInst_ID = SourceNowActInst.ActInst_ID; _RouteInst.NextActInst_ID = _ActInst.ActInst_ID; _RouteInst.ProInst_ID = SourceNowActInst.ProInst_ID; _RouteInst.Insert(); //写入流程实例 DataTable _DataTable = SourceNowActInst.ExecuteDataTable("select count(NowActInst_ID) from T_NowActInst " + "where ProInst_ID=" + SourceNowActInst.ProInst_ID.Value + " and " + "NowActInst_ID !=" + SourceNowActInst.NowActInst_ID.Value); //if (((int)_DataTable.Rows[0][0]) == 0) if (int.Parse(_DataTable.Rows[0][0].ToString()) == 0) { SourceNowActInst.ProInst.CopyFrom(SourceNowActInst.ActInst); SourceNowActInst.ProInst.ProInst_FinishDate = _DateTime; SourceNowActInst.ProInst.ProInst_State = SuperMap.RealEstate.Enums.ProInstState.Complete; SourceNowActInst.ProInst.Update(); } //SourceNowActInst.Delete(); //isProcessEnd = true; break; default: throw new Exception("暂时只支持转到交互活动和终止路由。"); } } #endregion /// public static bool TransferBefore(NowActInst SourceNowActInst) { //当前活动实例之前的活动是否存在实例 DataTable _DataTable = SourceNowActInst.ExecuteDataTable("select NowActInst_ID,ActDef_ID from T_NowActInst where ProInst_ID = " + SourceNowActInst.ProInst_ID.Value + " and NowActInst_ID != " + SourceNowActInst.NowActInst_ID.Value); foreach (DataRow _DataRow in _DataTable.Rows) { if (!TransferBefore(SourceNowActInst.ProDef.RouteCollection, SourceNowActInst.ActDef_ID.Value, (int)_DataRow["ActDef_ID"])) { NowActInst _NowActInst = new NowActInst(_DataRow, SourceNowActInst); if (!_NowActInst.Select()) { throw new Exception("无法获取当前流程实例,编号为:" + _DataRow["NowActInst_ID"].ToString()); } throw new Exception("业务曾回退,请等待「" + SourceNowActInst.User_Name + "」从「" + _NowActInst.ActInst_Name + "」转出。"); //return false; } } return true; } private static bool TransferBefore(List RouteCollection, int CurrActDef_ID, int TargetActDef_ID) { foreach (Support.Route _Route in RouteCollection) { if (_Route.NextActDef_ID != CurrActDef_ID) continue; if (_Route.ActDef_ID == TargetActDef_ID) { return false; } if (!TransferBefore(RouteCollection, _Route.ActDef_ID.Value, TargetActDef_ID)) { return false; } } return true; } ///// ///// ///// ///// ///// ///// ///// static ActDefType GetSupportNextActDef(ProInst ProInst, Support.ActDef currActDef, out List ListActDef) { ListActDef = new List(); ActDefType _ActDefType = ActDefType.None; if (currActDef.RouteCollection.Count > 1) { throw new Exception("过多转出路由定义,请检查流程定义。"); } else if (currActDef.RouteCollection.Count == 0) { throw new Exception("未定义转出路由,请检查流程定义。"); } foreach (Support.Route _RouteDef in currActDef.RouteCollection) { _ActDefType = _RouteDef.NextActDef.ActDef_Type.Value;//.ToString()); DateTime _DateTime = DateTime.Now; switch (_ActDefType) { case ActDefType.ActivityMerge: case ActDefType.ConditionOr: case ActDefType.ConditionAnd: //获取选择路由 ActDefType _ConditionOrActDefType = ActDefType.None; List _RouteCollection = _RouteDef.NextActDef.RouteCollection; if (_ActDefType != ActDefType.ActivityMerge) { IWorkFlowResetRouteDataAction _IWorkFlowResetRouteDataAction = ResetRouteDataAction(_RouteDef.NextActDef); if (_IWorkFlowResetRouteDataAction != null) { _RouteCollection = _IWorkFlowResetRouteDataAction.ResetRouteCollection(ProInst, _RouteCollection); } } foreach (Support.Route _ConditionRoute in _RouteCollection) { _ConditionOrActDefType = _ConditionRoute.NextActDef.ActDef_Type.Value; switch (_ConditionOrActDefType) { case ActDefType.Activity: case ActDefType.ProcessEnd: ListActDef.Add(_ConditionRoute.NextActDef); break; default: throw new Exception("路由模式,暂时只支持交互活动,请修改流程定义的路由指向。"); } } return _ActDefType; //break; case ActDefType.Activity: case ActDefType.ProcessEnd: //写入活动实例 ListActDef.Add(_RouteDef.NextActDef); break; default: throw new Exception("暂不支持 " + _ActDefType.ToString() + "模式!"); } } return _ActDefType; } /// public static ActDefType GetNextActDef(NowActInst SourceNowActInst, out List ListActDef, out string ErrorString) { ErrorString = string.Empty; ActDefType _ActDefType = GetSupportNextActDef(SourceNowActInst.ProInst, SourceNowActInst.ActDef, out ListActDef); switch (_ActDefType) { case ActDefType.ActivityMerge: Support.ActDef _NextActDef = SourceNowActInst.ActDef.RouteCollection[0].NextActDef; List _ActivityMerge = new List(); //找到合并前的所有ActDef_ID FindBeforeMergeActDefID(SourceNowActInst, _NextActDef.ActDef_ID.Value, _ActivityMerge); //排除自己 _ActivityMerge.Remove(SourceNowActInst.ActDef_ID.Value); //查看是否有实例 if (SourceNowActInst.GetCount("where ActDef_ID in (" + string.Join(",", _ActivityMerge.ToArray()) + ")" + " and ProInst_ID=" + SourceNowActInst.ProInst_ID.Value) > 0) { //如果有实例,先到汇合活动状态等待。 ListActDef.Clear(); _NextActDef.ActDef_Name += "[等待其他环节办结]"; ListActDef.Add(_NextActDef); } break; } return _ActDefType; } private static void FindBeforeMergeActDefID(NowActInst SourceNowActInst, int ActivityMerge_ID, List _ActivityMerge) { foreach (Support.Route _Route in SourceNowActInst.ProDef.RouteCollection) { if (_Route.NextActDef_ID == ActivityMerge_ID) { if ((_Route.ActDef.ActDef_Type.Value == ActDefType.Activity) || (_Route.ActDef.ActDef_Type.Value == ActDefType.ProcessStart)) { if (!_ActivityMerge.Contains(_Route.ActDef_ID.Value)) _ActivityMerge.Add(_Route.ActDef_ID.Value); } FindBeforeMergeActDefID(SourceNowActInst, _Route.ActDef_ID.Value, _ActivityMerge); } } } #region ResetRouteDataAction 获取路由的扩展对象 /// public static IWorkFlowResetRouteDataAction ResetRouteDataAction(Support.ActDef CurrActDef) { if (string.IsNullOrEmpty(CurrActDef.ActDef_FileName)) return null; if (string.IsNullOrEmpty(CurrActDef.ActDef_ClassName)) return null; string _ClassName = CurrActDef.ActDef_ClassName; string _FileName = CurrActDef.ActDef_FileName; if (_FileName.EndsWith(".dll", StringComparison.CurrentCultureIgnoreCase)) _FileName = _FileName.Substring(0, _FileName.Length - 4); List _InstClassCollection = new List(); if (_ClassName.StartsWith("RealEstate.")) { _InstClassCollection.Add("SuperMap." + _ClassName); } else if (!_ClassName.StartsWith("SuperMap.RealEstate.")) { if (_ClassName.StartsWith(_FileName)) _InstClassCollection.Add("SuperMap.RealEstate." + _ClassName); else { _InstClassCollection.Add("SuperMap.RealEstate." + _FileName + "." + _ClassName); _InstClassCollection.Add("SuperMap.RealEstate." + _ClassName); } } object _Obj = null; Exception _Exception = null; foreach (string _InstClass in _InstClassCollection) { try { _Obj = PluginManager.CreateInstance(_FileName, _InstClass); break; } catch (Exception ex) { _Exception = ex; } } if (_Obj is SuperMap.RealEstate.WorkFlow.Instance.IWorkFlowResetRouteDataAction) { return _Obj as SuperMap.RealEstate.WorkFlow.Instance.IWorkFlowResetRouteDataAction; } else throw new Exception("路由的扩展对象,必须基于IWorkFlowResetRouteDataAction接口。", _Exception); } #endregion #region GetActInstDataAction 获取活动的接口 /// public static IWorkFlowActInstDataAction GetActInstDataAction(NowActInst _NowActInst) { if (string.IsNullOrEmpty(_NowActInst.ActDef.ActDef_FileName)) return null; if (string.IsNullOrEmpty(_NowActInst.ActDef.ActDef_ClassName)) return null; string _ClassName = _NowActInst.ActDef.ActDef_ClassName; string _FileName = _NowActInst.ActDef.ActDef_FileName; if (_FileName.EndsWith(".dll", StringComparison.CurrentCultureIgnoreCase)) _FileName = _FileName.Substring(0, _FileName.Length - 4); List _InstClassCollection = new List(); if (_ClassName.StartsWith("RealEstate.")) { _InstClassCollection.Add("SuperMap." + _ClassName); } else if (!_ClassName.StartsWith("SuperMap.RealEstate.")) { if (_ClassName.StartsWith(_FileName)) _InstClassCollection.Add("SuperMap.RealEstate." + _ClassName); else { _InstClassCollection.Add("SuperMap.RealEstate." + _FileName + "." + _ClassName); _InstClassCollection.Add("SuperMap.RealEstate." + _ClassName); } } object _Obj = null; Exception _Exception = null; foreach (string _InstClass in _InstClassCollection) { try { _Obj = PluginManager.CreateInstance(_FileName, _InstClass); break; } catch (Exception ex) { _Exception = ex; } } if (_Obj is Instance.IWorkFlowActInstDataAction) { return _Obj as Instance.IWorkFlowActInstDataAction; } else throw new Exception("活动的扩展对象,必须基于IWorkFlowActInstDataAction接口。", _Exception); } #endregion #region GetProInstDataAction 获取流程的接口 /// public static IWorkFlowProInstDataAction GetProInstDataAction(NowActInst _NowActInst) { if (string.IsNullOrEmpty(_NowActInst.ProDef.ProDef_FileName)) throw new Exception("执行操作失败,流程配置中未定义扩展文件!"); if (string.IsNullOrEmpty(_NowActInst.ProDef.ProDef_ClassName)) throw new Exception("执行操作失败,流程配置中未定义扩展对象!"); string _ClassName = _NowActInst.ProDef.ProDef_ClassName; string _FileName = _NowActInst.ProDef.ProDef_FileName; if (_FileName.EndsWith(".dll", StringComparison.CurrentCultureIgnoreCase)) _FileName = _FileName.Substring(0, _FileName.Length - 4); //SuperMap.RealEstate.RealEstate.WorkFlow.WebSite.WorkFlow.Transact.DemoDataAction List _InstClassCollection = new List(); if (_ClassName.StartsWith("RealEstate.")) { _InstClassCollection.Add("SuperMap." + _ClassName); } else if (!_ClassName.StartsWith("SuperMap.RealEstate")) { if (_ClassName.StartsWith(_FileName)) _InstClassCollection.Add("SuperMap.RealEstate." + _ClassName); else { _InstClassCollection.Add("SuperMap.RealEstate." + _FileName + "." + _ClassName); _InstClassCollection.Add("SuperMap.RealEstate." + _ClassName); } } object _Obj = null; Exception _Exception = null; foreach (string _InstClass in _InstClassCollection) { try { _Obj = PluginManager.CreateInstance(_FileName, _InstClass); break; } catch (Exception ex) { _Exception = ex; } } if (_Obj is Instance.IWorkFlowProInstDataAction) return _Obj as Instance.IWorkFlowProInstDataAction; else throw new Exception("流程的扩展对象,必须基于IWorkFlowProInstDataAction接口。", _Exception); } #endregion } }