/// <summary> /// 将每一步的流程审核过程中的持久化实例保存下来 /// </summary> /// <param name="submitData">SubmitData</param> public static void AddInstance(SubmitData submitData, FlowUser fUser) { string instanceid = ""; try { //1查找工作流程实例ID;2查询工作流持久化对像;3保存持久化 FLOW_INSTANCE_STATEDAL dal = new FLOW_INSTANCE_STATEDAL(); FLOW_FLOWRECORDMASTER_T master = dal.GetFlowerMasterIDByFormid(dal.GetOracleConnection(), submitData.FormID); if (master != null && !string.IsNullOrEmpty(master.INSTANCEID.Trim())) { FLOW_INSTANCE_STATE entity = new FLOW_INSTANCE_STATE(); FLOW_INSTANCE_STATE model = dal.GetInstanceModel(dal.GetOracleConnection("OracleConnection"), master.INSTANCEID); if (!string.IsNullOrEmpty(model.INSTANCE_ID)) { instanceid = model.INSTANCE_ID; entity.INSTANCE_ID = model.INSTANCE_ID; // entity.STATE = model.STATE; // entity.STATUS = model.STATUS; // entity.UNLOCKED = model.UNLOCKED; // entity.BLOCKED = model.BLOCKED; // entity.INFO = model.INFO; // entity.MODIFIED = model.MODIFIED; // entity.OWNER_ID = model.OWNER_ID; // entity.OWNED_UNTIL = model.OWNED_UNTIL; // entity.NEXT_TIMER = model.NEXT_TIMER; // entity.CREATEID = submitData.ApprovalUser.UserID; //创建人ID entity.CREATENAME = submitData.ApprovalUser.UserName; //创建人姓名 entity.EDITID = fUser.NextEditUserID; //下一个审核人ID entity.EDITNAME = fUser.NextEditUserName; //下一个审核人姓名 entity.FORMID = master.FORMID; FLOW_INSTANCE_STATEDAL inDal = new FLOW_INSTANCE_STATEDAL(); inDal.Add(inDal.GetOracleConnection(), entity); LogHelper.WriteLog("Formid=" + submitData.FormID + "; instanceid=" + instanceid + " 将每一步的流程审核过程中的持久化实例保存下来,成功!"); } else { LogHelper.WriteLog("Formid=" + submitData.FormID + "; 没法找到持久化数据库的instanceid,可能丢失 instanceid=" + master.INSTANCEID + " "); } } } catch (Exception e) { LogHelper.WriteLog("Formid=" + submitData.FormID + "; instanceid=" + instanceid + " 将每一步的流程审核过程中的持久化实例保存下来出错:异常信息:" + e.ToString()); //throw new Exception(e.Message, e); } }
/// <summary> /// 我的单据新增 /// </summary> /// <param name="model"></param> /// <returns></returns> public static bool AddPersonalRecord( SubmitData submitData, string state, FlowUser user, FLOW_FLOWRECORDMASTER_T entity) { try { string SystemCode = string.Empty; string modeCode = string.Empty; string modeName = string.Empty; string strEntityKey = string.Empty; string msgOpen = string.Empty; string strBusiness = submitData.XML; SetFileFromBusinessXml(strBusiness, ref SystemCode, ref modeCode, ref modeName, ref strEntityKey, ref msgOpen); Tracer.Debug("在填写我的单据时候的参数CHECKSTATE:" + state + "||模块名称:" + user.ModelName); T_PF_PERSONALRECORD model = new T_PF_PERSONALRECORD(); model.SYSTYPE = user.SysCode; model.PERSONALRECORDID = Guid.NewGuid().ToString(); model.ISFORWARD = "0"; model.ISVIEW = "0"; switch (state) { case "1": model.MODELCODE = submitData.ModelCode; model.MODELID = submitData.FormID; if (string.IsNullOrWhiteSpace(submitData.SumbitUserID) && string.IsNullOrWhiteSpace(submitData.SumbitCompanyID)) { //预算有这样情况submitData.SumbitUserID为空 model.OWNERCOMPANYID = submitData.ApprovalUser.CompanyID; model.OWNERDEPARTMENTID = submitData.ApprovalUser.DepartmentID; model.OWNERID = submitData.ApprovalUser.UserID; model.OWNERPOSTID = submitData.ApprovalUser.PostID; } else { model.OWNERCOMPANYID = submitData.SumbitCompanyID; model.OWNERDEPARTMENTID = submitData.SumbitDeparmentID; model.OWNERID = submitData.SumbitUserID; model.OWNERPOSTID = submitData.SumbitPostID; } model.MODELDESCRIPTION = string.Format("您{0}的[{1}]正在审核中!", DateTime.Now.ToString("MM月dd日HH:mm"), user.ModelName.Trim()); break; case "2": model.MODELID = submitData.FormID; model.MODELCODE = entity.MODELCODE; model.MODELDESCRIPTION = string.Format("您{0}的[{1}]已经审核通过!", entity.CREATEDATE.Value.ToString("MM月dd日HH:mm"), user.ModelName.Trim()); break; case "3": model.MODELID = submitData.FormID; model.MODELCODE = entity.MODELCODE; model.MODELDESCRIPTION = string.Format("您{0}的[{1}]已经审核不通过!", entity.CREATEDATE.Value.ToString("MM月dd日HH:mm"), user.ModelName.Trim()); break; } model.CHECKSTATE = state; model.CREATEDATE = DateTime.Now; model.CONFIGINFO = msgOpen;// ConvertXML(submitData); if (!string.IsNullOrWhiteSpace(model.CONFIGINFO)) { EnginFlowDAL dal = new EnginFlowDAL(); string recordID = dal.GetExistRecord(model.SYSTYPE, model.MODELCODE, model.MODELID, model.ISFORWARD); if (recordID != "") { return dal.UpdatePersonalRecord(model, recordID); } else { return dal.AddPersonalRecord(model); } } else { Tracer.Debug("在填写我的单据时候获取不到配置FormID:" + submitData.FormID + ""); } return false; } catch (Exception ex) { Tracer.Debug("在填写我的单据时候错误FormID:" + submitData.FormID + "||Exception" + ex.Message); throw new Exception(ex.Message, ex); } }
/// <summary> /// 非默认消息时,自动发起流程 /// </summary> private void AutoCallFlow( EnginFlowDAL dal, T_WF_DOTASK Entity, DataTable dtFlowTrigger, DataTable sourceTable, ref FlowUser sUser,string strAppFieldValue, ref string ErroMessage) { DataRow[] NotDefaultMsg = dtFlowTrigger.Select("ISDEFAULTMSG=0");//非默认消息,需要调用的WCF待办任务 if (NotDefaultMsg != null && NotDefaultMsg.Count() > 0) { #region 非默认消息时,自动发起流程 foreach (DataRow dr1 in NotDefaultMsg) { string strAppMsg = string.Empty; CallWCFService( dr1, sourceTable, ref sUser, ref strAppMsg, ref ErroMessage);//调用WCF服务 if (!string.IsNullOrEmpty(strAppMsg)) { #region 执行自动发起流程结果返回不为空 try { string IsNewFlow = "1"; string NewFormID = string.Empty; string strFormTypes = string.Empty;//表单状态 DataRow DRNewTrigger = null; if (ApplicationValueToDataTable( strAppMsg, string.Concat(Entity.COMPANYID), ref sourceTable, ref IsNewFlow, ref NewFormID, ref strFormTypes, ref DRNewTrigger)) { //通过岗位查找用户,并且取第一个用户为发送消息的对像 //PersonnelServiceClient HRClient = new PersonnelServiceClient(); if (!string.IsNullOrEmpty(dr1["OWNERPOSTID"].ToString())) { if (DRNewTrigger != null) { Tracer.Debug("自动发起流程 消息规则设置中 选定岗位=" + dr1["OWNERPOSTID"].ToString() + " ;消息=" + string.Concat(dr1["MESSAGEBODY"]) + ":MODELCODE=" + string.Concat(DRNewTrigger["MODELCODE"]) + ";AutoCallFlow() FORMID=" + sUser.FormID); } else { Tracer.Debug("DRNewTrigger=null 自动发起流程的第三方消息规则中没有设置没有消息规则,当前的模块消息规则设置中 选定岗位=" + dr1["OWNERPOSTID"].ToString() + " ;消息=" + string.Concat(dr1["MESSAGEBODY"]) + ":MODELCODE=null;AutoCallFlow() FORMID=" + sUser.FormID); } List<string> Employees = new List<string>();// HRClient.GetEmployeeIDsByPostID(dr1["OWNERPOSTID"].ToString()); using (EmployeeBLL bll = new EmployeeBLL()) { var q = bll.GetEmployeeIDsByPostID(dr1["OWNERPOSTID"].ToString()); Employees= q.Count() > 0 ? q.ToList() : null; } if (Employees != null && Employees.Count() > 0) { Entity.SYSTEMCODE = dr1["SYSTEMCODE"].ToString();//解决傅意成遇到的问题(发起员工入职手续的待办,数据库中数据存在问题,系统代号是错误的RM代号,应是HR代号) dal.AddDoTask( Entity, dr1, sourceTable, Employees[0], NewFormID, strAppFieldValue, string.Concat(dr1["MESSAGEBODY"]), strFormTypes);//发送消息 //FlowEngine.TaskCacheReflesh(Employees[0]); } } else { string cMessage = ""; if (DRNewTrigger != null) { cMessage = "SystemCode:" + string.Concat(DRNewTrigger["SYSTEMCODE"]) + " MODELCODE:" + string.Concat(DRNewTrigger["MODELCODE"]) + " ;消息=" + string.Concat(dr1["MESSAGEBODY"]) + " NewFormID:" + NewFormID; } else { cMessage = "DRNewTrigger=null 消息=" + string.Concat(dr1["MESSAGEBODY"]) + " NewFormID:" + NewFormID; } //string cMessage = "SystemCode:" + string.Concat(DRNewTrigger["SYSTEMCODE"]) + " MODELCODE:" + string.Concat(DRNewTrigger["MODELCODE"]) + " ;消息=" + string.Concat(dr1["MESSAGEBODY"]) + " NewFormID:" + NewFormID; ErroMessage = cMessage; if (DRNewTrigger["MODELCODE"].ToString().ToLower() == "t_oa_businesstrip" || DRNewTrigger["MODELCODE"].ToString().ToLower() == "t_oa_businessreport" || DRNewTrigger["MODELCODE"].ToString().ToLower() == "t_hr_salaryrecordbatch" || DRNewTrigger["MODELCODE"].ToString().ToLower() == "t_hr_attendancesolutionasign" || DRNewTrigger["MODELCODE"].ToString().ToLower() == "t_hr_attendancesolution" || DRNewTrigger["MODELCODE"].ToString().ToLower() == "t_hr_employeesalaryrecord" || DRNewTrigger["MODELCODE"].ToString().ToLower() == "t_hr_employeeentry" || DRNewTrigger["MODELCODE"].ToString().ToLower() == "t_hr_leftoffice" || DRNewTrigger["MODELCODE"].ToString().ToLower() == "t_oa_travelreimbursement" || DRNewTrigger["MODELCODE"].ToString().ToLower() == "t_hr_leftofficeconfirm" ) {//不需要接收岗位的: //出差申请 T_OA_BUSINESSTRIP //出差报告 T_OA_BUSINESSREPORT //月薪批量审核 T_HR_SALARYRECORDBATCH //考勤方案分配 T_HR_ATTENDANCESOLUTIONASIGN //考勤方案定义 T_HR_ATTENDANCESOLUTION //薪资记录 T_HR_EMPLOYEESALARYRECORD //员工入职 T_HR_EMPLOYEEENTRY //员工离职 T_HR_LEFTOFFICE //离职确认 T_HR_LEFTOFFICECONFIRM //出差报销 T_OA_TRAVELREIMBURSEMENT Tracer.Debug("自动发起流程 消息规则中非默认的设置中 不需要 选定岗位: AutoCallFlow() FORMID=" + sUser.FormID + " " + cMessage); } else { Tracer.Debug("自动发起流程(失败) 消息规则中非默认的设置中没有选定岗位:AutoCallFlow() FORMID=" + sUser.FormID + " " + cMessage); throw new Exception("自动发起流程(失败) 消息规则中非默认的设置中没有选定岗位 \r\n FORMID=" + sUser.FormID); } } } } catch (Exception ex) { Tracer.Debug("自动发起流程(失败):消息规则中非默认的设置中检查选定岗位出错 消息=" + string.Concat(dr1["MESSAGEBODY"]) + " AutoCallFlow() FORMID=" + sUser.FormID + " 异常信息:\r\n" + ex.Message); throw new Exception("自动发起流程(失败):消息规则中非默认的设置中检查选定岗位出错 \r\n FORMID=" + sUser.FormID); } #endregion } else { Tracer.Debug("自动发起流程成功,但返回的结果为空 消息规则设置中 ;选定岗位=" + dr1["OWNERPOSTID"].ToString() + " ;消息=" + string.Concat(dr1["MESSAGEBODY"]) + ";MODELCODE=" + string.Concat(dr1["MODELCODE"]) + ":AutoCallFlow() FORMID=" + sUser.FormID); } } #endregion } }
//下一审核人提交审核时调用方法 /// <summary> /// 固定流程:下一审核人提交审核时调用方法 /// </summary> /// <param name="submitData"></param> /// <param name="dataResult"></param> /// <param name="listDetail"></param> /// <returns></returns> public DataResult ApprovalFlow2(OracleConnection con, SubmitData submitData, DataResult dataResult, List<FLOW_FLOWRECORDDETAIL_T> listDetail, ref FlowUser user, ref string msg) { if (submitData.NextApprovalUser == null) { submitData.NextApprovalUser = new UserInfo(); } ///针对会签,该次审核成功后是否跳转至下一状态 bool isGotoNextState = true; // WorkflowRuntime workflowRuntime = null; WorkflowInstance instance = null; FLOW_FLOWRECORDDETAIL_T entity = new FLOW_FLOWRECORDDETAIL_T(); entity.FLOW_FLOWRECORDMASTER_T = new FLOW_FLOWRECORDMASTER_T(); try { #region Entity赋值 List<FLOW_FLOWRECORDDETAIL_T> tmpEntity = listDetail.Where(c => (c.EDITUSERID == submitData.ApprovalUser.UserID || c.AGENTUSERID == submitData.ApprovalUser.UserID) && c.FLAG == "0").ToList(); if (tmpEntity == null) { dataResult.FlowResult = FlowResult.FAIL; dataResult.Err = "没有找到待审核信息 FORMID=" + user.FormID + "\r\n"; user.TrackingMessage += "没有找到待审核信息 FORMID=" + user.FormID + "\r\n"; return dataResult; } entity = tmpEntity[0]; entity.EDITDATE = DateTime.Now; //审批时间 if (entity.AGENTUSERID == submitData.ApprovalUser.UserID) { entity.AGENTEDITDATE = entity.EDITDATE; //代理审批时审批时间与代理审批时间到致 } entity.CONTENT = submitData.ApprovalContent; entity.CHECKSTATE = ((int)submitData.ApprovalResult).ToString(); #endregion #region backup persisted workflow instanceState if (!string.IsNullOrEmpty(entity.FLOW_FLOWRECORDMASTER_T.INSTANCEID)) { String connStringPersistence = ConfigurationManager.ConnectionStrings["OracleConnection"].ConnectionString;//Data Source=172.30.50.110;Initial Catalog=WorkflowPersistence;Persist Security Info=True;User ID=sa;Password=fbaz2012;MultipleActiveResultSets=True"; string sql=string.Format("select * from instance_state where instance_id='{0}'", entity.FLOW_FLOWRECORDMASTER_T.INSTANCEID); user.InstanceState = MsOracle.GetDataSetByConnection(connStringPersistence, sql); } #endregion //workflowRuntime.StartRuntime(); user.TrackingMessage += "创建工作流运行时开始 FORMID=" + user.FormID + "\r\n"; workflowRuntime = SMTWorkFlowManage.CreateWorkFlowRuntime(true); try { instance = SMTWorkFlowManage.GetWorkflowInstance(workflowRuntime,entity.FLOW_FLOWRECORDMASTER_T.INSTANCEID);// workflowRuntime.GetWorkflow(new Guid(tmp[0].FLOW_FLOWRECORDMASTER_T.INSTANCEID)); user.TrackingMessage += "FormID=" + submitData.FormID + ";ApprovalFlow2(try)从持久化库[ 完成 ]恢复创建工作流实例ID=" + entity.FLOW_FLOWRECORDMASTER_T.INSTANCEID + "\r\n"; LogHelper.WriteLog("审核 FormID=" + user.FormID + " WorkflowInstance ID=" + instance.InstanceId.ToString()); } catch (Exception exGetWorkflowInstance) { #region 重新创建新流程,将新流程设置为当前状态。 try { user.TrackingMessage += "FormID=" + submitData.FormID + ";从持久化恢复工作流失败 SMTWorkFlowManage.GetWorkflowInstance(" + workflowRuntime.Name + ", " + entity.FLOW_FLOWRECORDMASTER_T.INSTANCEID + ");原因如下:\r\n" + exGetWorkflowInstance.ToString() + ";\r\n下面重新创建新流程,并将新流程设置为当前状态;\r\nGetFlowByModelName:submitData.ApprovalUser.DepartmentID=" + submitData.ApprovalUser.DepartmentID + ";OrgType='" + ((int)submitData.FlowType).ToString() + "'"; List<FLOW_MODELFLOWRELATION_T> MODELFLOWRELATION = GetFlowByModelName(con, entity.FLOW_FLOWRECORDMASTER_T.CREATECOMPANYID, entity.FLOW_FLOWRECORDMASTER_T.CREATEDEPARTMENTID, submitData.ModelCode, ((int)submitData.FlowType).ToString(), ref user); FLOW_MODELFLOWRELATION_T flowRelation = MODELFLOWRELATION[0]; FLOW_FLOWDEFINE_T flowDefine = flowRelation.FLOW_FLOWDEFINE_T; instance = SMTWorkFlowManage.CreateWorkflowInstance(workflowRuntime , flowDefine.XOML, flowDefine.RULES); user.TrackingMessage += "FormID=" + submitData.FormID + ";ApprovalFlow2(catch)完成重新创建工作流实例ID=" + instance.InstanceId + "\r\n"; StateMachineWorkflowInstance workflowinstance = new StateMachineWorkflowInstance(workflowRuntime, instance.InstanceId); ManualWorkflowSchedulerService scheduleService = workflowRuntime.GetService(typeof(ManualWorkflowSchedulerService)) as ManualWorkflowSchedulerService; scheduleService.RunWorkflow(workflowinstance.InstanceId); workflowinstance.SetState(entity.STATECODE); //System.Threading.Thread.Sleep(1000); //commented by alan 2012/9/7 instance = SMTWorkFlowManage.GetWorkflowInstance(workflowRuntime,instance.InstanceId.ToString()); user.TrackingMessage += "FormID=" + submitData.FormID + ";ApprovalFlow2(catch)从持久化库再恢复刚才创建工作流实例ID=" + instance.InstanceId + "\r\n"; entity.FLOW_FLOWRECORDMASTER_T.INSTANCEID = instance.InstanceId.ToString(); //FLOW_FLOWRECORDDETAIL_TDAL.UpdateMasterINSTANCEID(entity.FLOW_FLOWRECORDMASTER_T); FLOW_FLOWRECORDMASTER_TDAL.UpdateMasterINSTANCEID(con, entity.FLOW_FLOWRECORDMASTER_T); } catch (Exception exNewInstance) { user.ErrorMsg += "重新创建新流程,将新流程设置为当前状态失败:FormID=" + submitData.FormID + "异常信息:\r\n" + exNewInstance.Message + "\r\n"; LogHelper.WriteLog("重新创建新流程,将新流程设置为当前状态失败:FormID=" + submitData.FormID + "FlowBLL->ApprovalFlow2" + exNewInstance.Message); //Tracer.Debug("exNewInstance: -" + submitData.FormID + "--submitDataXML:" + submitData.XML + "-" + exNewInstance.InnerException + exNewInstance.Message); throw new Exception("重新创建新流程,将新流程设置为当前状态失败,请联系管理!"); } #endregion } user.TrackingMessage += "SMTWorkFlowManage.CreateWorkFlowRuntime(true)完成FORMID=" + user.FormID + " \r\n"; #region 当前状态会签状态处理 bool currentIsCountersign = false; string currentCountersignType = "0"; Utility.IsCountersign(entity.FLOW_FLOWRECORDMASTER_T.ACTIVEROLE, entity.STATECODE, ref currentIsCountersign, ref currentCountersignType); if (currentIsCountersign) { user.TrackingMessage += "状态会签状态处理 FORMID=" + user.FormID + " \r\n"; if (currentCountersignType == "1")//一人通过即所有通过,可以跳转至下一状态 { isGotoNextState = true; } else { ///该审核是会签的最后的审核人 if (entity.FLOW_FLOWRECORDMASTER_T.FLOW_FLOWRECORDDETAIL_T.Count == 1) { isGotoNextState = true; } else { isGotoNextState = false; } } user.TrackingMessage += "状态会签状态处理完成 FORMID=" + user.FormID + " \r\n"; } #endregion //不同意状态处理 if (submitData.ApprovalResult == ApprovalResult.NoPass) { user.TrackingMessage += "审核不通过状态处理(开始) FORMID=" + user.FormID + " \r\n"; #region instance.Terminate("0"); entity.FLOW_FLOWRECORDMASTER_T.CHECKSTATE = "3"; //设为终审不通过 entity.FLOW_FLOWRECORDMASTER_T.EDITUSERID = submitData.ApprovalUser.UserID; entity.FLOW_FLOWRECORDMASTER_T.EDITUSERNAME = submitData.ApprovalUser.UserName; entity.FLOW_FLOWRECORDMASTER_T.EDITDATE = DateTime.Now; user.TrackingMessage += "审核不通过【开始更新明细表】!FORMID=" + user.FormID; //user.TrackingMessage += "entity.FLOWRECORDDETAILID" + entity.FLOWRECORDDETAILID + "\r\n";// //user.TrackingMessage += "entity.STATECODE=" + entity.STATECODE + "\r\n";// //user.TrackingMessage += "entity.PARENTSTATEID =" + entity.PARENTSTATEID + "\r\n";// //user.TrackingMessage += "entity.CONTENT=" + entity.CONTENT + "\r\n";// //user.TrackingMessage += "entity.CHECKSTATE=" + entity.CHECKSTATE + "\r\n";//同意:1,不同意:0 ,未处理:2,会签同意7,会签不同意8 //user.TrackingMessage += "entity.FLAG =" + entity.FLAG + "\r\n";//已审批:1,未审批:0 //user.TrackingMessage += " entity.CREATEUSERID =" + entity.CREATEUSERID + "\r\n";// //user.TrackingMessage += "entity.CREATEUSERNAME="******"\r\n";// //user.TrackingMessage += " entity.CREATECOMPANYID=" + entity.CREATECOMPANYID + "\r\n";// //user.TrackingMessage += " entity.CREATEDEPARTMENTID =" + entity.CREATEDEPARTMENTID + "\r\n";// //user.TrackingMessage += "entity.CREATEPOSTID=" + entity.CREATEPOSTID + "\r\n";// //user.TrackingMessage += "entity.CREATEDATE=" + entity.CREATEDATE + "\r\n";// //user.TrackingMessage += " entity.EDITUSERID=" + entity.EDITUSERID + "\r\n";// //user.TrackingMessage += "entity.EDITUSERNAME="******"\r\n";// //user.TrackingMessage += " entity.EDITCOMPANYID =" + entity.EDITCOMPANYID + "\r\n";// //user.TrackingMessage += " entity.EDITDEPARTMENTID=" + entity.EDITDEPARTMENTID + "\r\n";// //user.TrackingMessage += "entity.EDITPOSTID=" + entity.EDITPOSTID + "\r\n";// //user.TrackingMessage += "entity.EDITDATE=" + entity.EDITDATE + "\r\n";// //user.TrackingMessage += "entity.AGENTUSERID =" + entity.AGENTUSERID + "\r\n";// //user.TrackingMessage += " entity.AGENTERNAME=" + entity.AGENTERNAME + "\r\n";// //user.TrackingMessage += "entity.AGENTEDITDATE=" + entity.AGENTEDITDATE + "\r\n";// //user.TrackingMessage += "submitData.NextStateCode=" + submitData.NextStateCode + "\r\n";// //user.TrackingMessage += "submitData.NextApprovalUser.UserID=" + submitData.NextApprovalUser.UserID + "\r\n";// //user.TrackingMessage += " entity.FLOW_FLOWRECORDMASTER_T.FLOWRECORDMASTERID=" + entity.FLOW_FLOWRECORDMASTER_T.FLOWRECORDMASTERID + "\r\n";// UpdateFlowRecord(con, entity, submitData.NextStateCode, submitData.NextApprovalUser.UserID); user.TrackingMessage += "审核不通过【开始更新主表】!FORMID=" + user.FormID; FLOW_FLOWRECORDMASTER_TDAL.Update(entity.FLOW_FLOWRECORDMASTER_T); dataResult.CheckState = "3";// dataResult.FlowResult = FlowResult.END; if (currentIsCountersign) { #region 当前是会签状态,删除未审核记录 user.TrackingMessage += "审核不通过【当前是会签状态,删除未审核记录】!FORMID=" + user.FormID; entity.FLOW_FLOWRECORDMASTER_T.FLOW_FLOWRECORDDETAIL_T .Where(detail => detail.FLOWRECORDDETAILID != entity.FLOWRECORDDETAILID && detail.STATECODE == entity.STATECODE && detail.FLAG == "0") .ToList().ForEach(item => { item.FLAG = "1"; item.CHECKSTATE = "8"; UpdateFlowRecord2(con, item); }); #endregion } #endregion user.TrackingMessage += "审核通过状态处理(完成) FORMID=" + user.FormID + " \r\n"; } else { if (!isGotoNextState) { user.TrackingMessage += "isGotoNextState开始 FORMID=" + user.FormID + " \r\n"; #region UpdateFlowRecord2(con, entity); dataResult.AppState = entity.STATECODE; dataResult.FlowResult = FlowResult.SUCCESS; dataResult.CheckState = "1"; #endregion user.TrackingMessage += "isGotoNextState完成 FORMID=" + user.FormID + "\r\n"; } else { user.TrackingMessage += "获取下一状态数据开始 FORMID=" + user.FormID + " \r\n"; #region 获取下一状态数据 List<string> User = new List<string>(); User.Add(entity.FLOW_FLOWRECORDMASTER_T.CREATEUSERID); User.Add(submitData.ApprovalUser.UserID); List<string> tmpPostID = new List<string>(); tmpPostID.Add(entity.FLOW_FLOWRECORDMASTER_T.CREATEPOSTID); tmpPostID.Add(entity.EDITPOSTID); GetUserByInstance2(entity.FLOW_FLOWRECORDMASTER_T.CREATECOMPANYID, workflowRuntime, instance, entity.FLOW_FLOWRECORDMASTER_T.ACTIVEROLE, submitData.XML, entity.STATECODE, User, tmpPostID, submitData.FlowType, ref dataResult, ref user); if (dataResult.FlowResult == FlowResult.FAIL) { return dataResult; } submitData.NextStateCode = dataResult.AppState; if (dataResult.IsCountersign) { #region if (dataResult.FlowResult == FlowResult.Countersign) { if (submitData.DictCounterUser == null || submitData.DictCounterUser.Keys.Count == 0) { return dataResult; } } else { if (submitData.DictCounterUser == null || submitData.DictCounterUser.Keys.Count == 0) { submitData.DictCounterUser = dataResult.DictCounterUser; } } #endregion } else { #region if (dataResult.FlowResult == FlowResult.MULTIUSER) { if (submitData.NextApprovalUser == null || (Utility.GetString(submitData.NextApprovalUser.UserID) == "" || Utility.GetString(submitData.NextApprovalUser.UserName) == "")) { return dataResult; } } else { if (submitData.DictCounterUser == null || submitData.DictCounterUser.Keys.Count == 0) { submitData.NextApprovalUser = dataResult.UserInfo[0]; } } #endregion } #endregion user.TrackingMessage += "获取下一状态数据完成 FORMID=" + user.FormID + "\r\n"; user.TrackingMessage += "单据会签情况开始 FORMID=" + user.FormID + "\r\n"; #region 对于单会签情况,需要将其他审核人的审核设为会签通过状态 if (currentIsCountersign && currentCountersignType == "1") { entity.FLOW_FLOWRECORDMASTER_T.FLOW_FLOWRECORDDETAIL_T .Where(detail => detail.FLOWRECORDDETAILID != entity.FLOWRECORDDETAILID && detail.STATECODE == entity.STATECODE && detail.FLAG == "0") .ToList().ForEach(item => { item.FLAG = "1"; item.CHECKSTATE = "7"; UpdateFlowRecord2(con, item); }); } #endregion user.TrackingMessage += "单据会签情况完成 FORMID=" + user.FormID + "\r\n"; #region FlowDataType.FlowData FlowData = new FlowDataType.FlowData(); FlowData.xml = submitData.XML; workflowRuntime.WorkflowCompleted += delegate(object sender, WorkflowCompletedEventArgs e) { instance = null; }; user.TrackingMessage += "处理kpi 开始 FORMID=" + user.FormID + "\r\n"; #region 处理kpi时间 string KPITime = ""; //PerformanceServiceWS.PerformanceServiceClient psc = new PerformanceServiceWS.PerformanceServiceClient(); string pscResult = entity.FLOW_FLOWRECORDMASTER_T.KPITIMEXML; //psc.Close(); if (!string.IsNullOrEmpty(pscResult)) { XElement xe = XElement.Parse(pscResult); Func<XElement, bool> f = (x) => { XAttribute xid = x.Attribute("id"); XAttribute xvalue = x.Attribute("value"); if (xid == null || xvalue == null) return false; else { if (xid.Value == dataResult.AppState) return true; else return false; } }; XElement FlowNode = xe.Elements("FlowNode").FirstOrDefault(f); if (FlowNode != null) { KPITime = FlowNode.Attribute("value").Value; } } dataResult.KPITime = KPITime; #endregion user.TrackingMessage += "处理kpi 完成 FORMID=" + user.FormID + "\r\n"; if (!dataResult.IsCountersign) { user.TrackingMessage += "非会签 开始 FORMID=" + user.FormID + "\r\n"; #region 非会签 UserInfo AppUser = submitData.NextApprovalUser; dataResult.UserInfo.Clear(); dataResult.UserInfo.Add(AppUser); UserInfo AgentAppUser = GetAgentUserInfo(submitData.ModelCode, AppUser.UserID);//查询是否启用了代理人 dataResult = DoFlowRecord2(con, workflowRuntime, instance, entity, submitData.NextStateCode, AppUser, AgentAppUser, submitData.SubmitFlag, submitData.FlowType,ref user); //处理流程数据 dataResult.AgentUserInfo = AgentAppUser; dataResult.IsCountersign = false; #endregion user.TrackingMessage += "非会签 完成 FORMID=" + user.FormID + "\r\n"; } else { #region 会签 dataResult.DictCounterUser = submitData.DictCounterUser; Dictionary<UserInfo, UserInfo> dictAgentUserInfo = GetAgentUserInfo2(submitData.ModelCode, submitData.DictCounterUser); dataResult = DoFlowRecord_Approval(con, workflowRuntime, instance, entity, submitData.NextStateCode, submitData.DictCounterUser, dictAgentUserInfo, submitData.SubmitFlag, submitData.FlowType); //处理流程数据 dataResult.DictAgentUserInfo = dictAgentUserInfo; dataResult.IsCountersign = true; #endregion } user.TrackingMessage += "激发流程引擎执行到一下流程 开始 FORMID=" + user.FormID + "\r\n"; #region 激发流程引擎执行到一下流程 StateMachineWorkflowInstance workflowinstance = new StateMachineWorkflowInstance(workflowRuntime, instance.InstanceId); ManualWorkflowSchedulerService scheduleService = workflowRuntime.GetService(typeof(ManualWorkflowSchedulerService)) as ManualWorkflowSchedulerService; if (dataResult.AppState == null || dataResult.AppState == "") { scheduleService.RunWorkflow(workflowinstance.InstanceId); workflowRuntime.GetService<FlowEvent>().OnDoFlow(instance.InstanceId, FlowData); //激发流程引擎执行到一下流程 scheduleService.RunWorkflow(workflowinstance.InstanceId); } else { string ss = ""; int n = 0; scheduleService.RunWorkflow(workflowinstance.InstanceId); workflowinstance.SetState(dataResult.AppState); //流程跳转到指定节点 //while (true) //{ // ss += (n++).ToString()+"|" + workflowinstance.CurrentStateName; // string stateName = workflowinstance.CurrentStateName; // if (stateName != null && stateName.ToUpper().IndexOf("START") == -1) // { // break; // } //} } #endregion user.TrackingMessage += "激发流程引擎执行到一下流程 完成 FORMID=" + user.FormID + "\r\n"; //dataResult.CanSendMessage = true; user.TrackingMessage += "System.Threading.Thread.Sleep(1000)\r\n"; //System.Threading.Thread.Sleep(1000); //Commented by Alan 2012-7-25 ,使用手动ScheduleService运行工作流,此处不需要 if (submitData.FlowType == FlowType.Task) dataResult.SubModelCode = Utility.GetSubModelCode(entity.FLOW_FLOWRECORDMASTER_T.ACTIVEROLE, dataResult.AppState); //返回下一子模块代码 user.TrackingMessage += "System.Threading.Thread.Sleep(1000)完成\r\n"; #endregion } } dataResult.CurrentIsCountersign = currentIsCountersign; dataResult.IsGotoNextState = isGotoNextState; return dataResult; } catch (Exception e) { user.ErrorMsg += "提交审核时出错!FORMID=" + user.FormID + " 异常信息:" + e.ToString()+ "\r\n"; LogHelper.WriteLog("提交审核时出错!FORMID=" + user.FormID + " 异常信息:" + e.ToString()); throw new Exception("提交审核时出错,请联系管理员! \r\n FormID=" + user.FormID + ""); } finally { entity = null; instance = null; SMTWorkFlowManage.ColseWorkFlowRuntime(workflowRuntime); } }
/// <summary> /// 流程触发 /// </summary> /// <param name="strFlow">流程数据</param> /// <param name="strBusiness">业务数据</param> /// <returns></returns> public bool SaveFlowTriggerData( SubmitData submitData, string strFlow, string strBusiness, ref FlowUser sUser, ref string ErroMessage) { string tmpFlow = ""; string tmpEngline = ""; T_WF_DOTASK entity = new T_WF_DOTASK(); string strEntityType = string.Empty;//EntityType (表名) string strEntityKey = string.Empty;//EntityKey (主键) string IsTask = "1";//是否任务 #region 获取 SystemCode string SystemCode = ""; //Byte[] bFlow = System.Text.UTF8Encoding.UTF8.GetBytes(strFlow); //XElement xeFlow = XElement.Load(System.Xml.XmlReader.Create(new MemoryStream(bFlow))); //var strReturn = from item in xeFlow.Descendants("SystemCode") // select item; //if (strReturn.FirstOrDefault() != null) //{ // SystemCode=strReturn.FirstOrDefault().Value.Replace("\"", ""); //} SystemCode = string.Empty; string modeCode=string.Empty; string modeName=string.Empty; string msgOpen= string.Empty; SetFileFromBusinessXml(strBusiness, ref SystemCode, ref modeCode, ref modeName,ref strEntityKey, ref msgOpen); strEntityType = modeCode; entity.SYSTEMCODE = SystemCode; #endregion try { try { //消息解析 //Tracer.Debug("strFlow:\r\n" + strFlow); //Tracer.Debug("strBusiness:\r\n" + strBusiness); string xmlred = " 开始消息解析XML\r\n"; xmlred += "FlowXML=" + strFlow+"\r\n"; xmlred += "AppXML=" + strBusiness + "\r\n"; #region 提莫科技新增 #region strFlow StringReader strRdr = new StringReader(strFlow); XmlReader xr = XmlReader.Create(strRdr); StringBuilder _ConbinString = new StringBuilder(); while (xr.Read()) { if (xr.NodeType == XmlNodeType.Element) { string elementName = xr.Name; if (elementName == "Message") { while (xr.Read()) { string type = xr.NodeType.ToString(); #region if (xr["Name"] != null) { _ConbinString.Append(xr["Name"] + "|" + xr["DataValue"] + "Ё"); tmpFlow += xr["Name"] + "|" + xr["DataValue"] + "Ё\r\n"; if (xr["Name"].ToUpper() == "COMPANYID") { entity.COMPANYID = xr["DataValue"]; } if (xr["Name"].ToUpper() == "MODELCODE") { entity.MODELCODE = xr["DataValue"]; } if (xr["Name"].ToUpper() == "MODELNAME") { entity.MODELNAME = xr["DataValue"]; } if (xr["Name"].ToUpper() == "FORMID") { entity.ORDERID = xr["DataValue"]; } if (xr["Name"].ToUpper() == "CHECKSTATE") { entity.ORDERSTATUS = int.Parse(xr["DataValue"]); } if (xr["Name"].ToUpper() == "APPUSERID") { entity.RECEIVEUSERID = xr["DataValue"]; } if (xr["Name"].ToUpper() == "ISTASK") { IsTask = xr["DataValue"]; } if (xr["Name"].ToUpper() == "OUTTIME") { if (!string.IsNullOrEmpty(xr["DataValue"])) { entity.BEFOREPROCESSDATE = DateTime.Now.AddMinutes(int.Parse(xr["DataValue"])); } } } #endregion } } } } entity.FLOWXML = strFlow; entity.APPXML = strBusiness; #endregion #region strBusiness if (!string.IsNullOrEmpty(strBusiness)) { StringReader rd = new StringReader(strBusiness); XmlReader xdr = XmlReader.Create(rd); StringBuilder BOObject = new StringBuilder(); while (xdr.Read()) { if (xdr.NodeType == XmlNodeType.Element) { string elementName = xdr.Name; if (elementName == "Object") { while (xdr.Read()) { if (xdr.Name == "Attribute") { if (xdr["Name"] != null) { BOObject.Append(xdr["Name"] + "|" + xdr["DataValue"] + "Г" + (xdr["DataText"] != null ? xdr["DataText"] : xdr["DataValue"]) + "Ё"); tmpEngline += xdr["Name"] + "|" + xdr["DataValue"] + "Г" + (xdr["DataText"] != null ? xdr["DataText"] : xdr["DataValue"]) + "Ё\r\n"; #region if (xdr["Name"].ToUpper() == "OWNERID") { entity.ORDERUSERID = xdr["DataValue"]; } if (xdr["Name"].ToUpper() == "OWNERNAME") { entity.ORDERUSERNAME = xdr["DataValue"]; } if (xdr["Name"].ToUpper() == "CREATEUSERID") { //有些特殊的模块需要改变接收人 if (CheckModelName(entity.MODELCODE) && entity.ORDERSTATUS == 2) { entity.RECEIVEUSERID = xdr["DataValue"]; } } #endregion } } } } } } entity.APPFIELDVALUE = _ConbinString.ToString() + BOObject.ToString().TrimEnd('Ё'); } #endregion #endregion xmlred+="FormID=" + entity.ORDERID+" 结束消息解析XML"; Tracer.Debug("FormID=" + entity.ORDERID + xmlred); } catch (Exception ex) { sUser.ErrorMsg += "命名空间:SMT.FlowWFService.EnginFlowBLL 类方法SaveFlowTriggerData()解析XML出错!FORMID=" + sUser.FormID + " 异常信息:" + ex.ToString() + "\r\n"; ErroMessage = "命名空间:SMT.FlowWFService.EnginFlowBLL 类方法SaveFlowTriggerData()解析XML出错"; throw new Exception("命名空间:SMT.FlowWFService.EnginFlowBLL 类方法SaveFlowTriggerData()解析XML出错" + ex.Message); } if (string.IsNullOrEmpty(entity.SYSTEMCODE)) { entity.SYSTEMCODE = SystemCode; } //思路: //1、先检验流程的默认消息 //2、调用业务系统更新 //3、自动发起流程 bool IsExecute = SendDotask(submitData.SumbitUserName,modeName,msgOpen, entity, IsTask,ref sUser, ref ErroMessage); if (IsExecute) { bool isOK = CallBusinessSystem(submitData,entity, strEntityKey, ref ErroMessage);//调用业务系统 if (!isOK) { throw new Exception(ErroMessage);//把业务系统的错误信息给客户端 } AutoCallFlow( dal, entity, dtFlowTrigger, sourceTable, ref sUser, strAppFieldValue, ref ErroMessage); } else { Tracer.Debug("没有默认消息,也调用业务系统更新(没有待办任务产生) FORMID=" + sUser.FormID + " 异常信息:" + ErroMessage); CallBusinessSystem(submitData,entity, strEntityKey, ref ErroMessage);//调用业务系统 } return IsExecute; } catch (Exception ex) { sUser.ErrorMsg += "命名空间:SMT.FlowWFService.EnginFlowBLL 类方法SaveFlowTriggerData()!FORMID=" + sUser.FormID + " 异常信息:" + ex.ToString() + "\r\n"; throw new Exception("命名空间:SMT.FlowWFService.EnginFlowBLL 类方法SaveFlowTriggerData()" + ex.Message); } }
/// <summary> /// 通过模块名查找使用流程 /// </summary> /// <param name="CompanyID"></param> /// <param name="DepartID"></param> /// <param name="ModelCode"></param> /// <param name="FlowType"></param> /// <returns></returns> public static List<FLOW_MODELFLOWRELATION_T> GetFlowByModelName(string CompanyID, string DepartID, string ModelCode, string FlowType, ref FlowUser user) { try { //Flow_ModelFlowRelation_TDAL Dal = new Flow_ModelFlowRelation_TDAL(); //以部门查找流程 Tracer.Debug("以部门查找流程FLOW_MODELFLOWRELATION_TDAL.GetFlowByModelName:OrgType='1' ;CompanyID=" + CompanyID + ";DepartID=" + DepartID + ";FlowType=" + FlowType + ""); List<FLOW_MODELFLOWRELATION_T> xoml = FLOW_MODELFLOWRELATION_TDAL.GetFlowByModelName(CompanyID, DepartID, ModelCode, FlowType, "1"); if (xoml != null && xoml.Count > 0) //找到匹配流程返回 { #region 写日志 if (user != null) { if (CompanyID == user.CompayID && DepartID == user.DepartmentID) { Tracer.Debug("FormID=" + user.FormID + ";找到公司[ " + user.CompayName + " ]下部门[ " + user.DepartmentName + " ]的匹配流程返回"); } } #endregion return xoml; } //部门的上级机构(一般是公司)查找流程 if (user != null) { Tracer.Debug("FormID=" + user.FormID + ";没有找到公司[ " + user.CompayName + " ]下部门[ " + user.DepartmentName + " ]的匹配流程返回,继续部门的上级机构查找流程"); } //OrganizationServiceClient Organization = new OrganizationServiceClient(); Dictionary<string, string> OrganizationList = new Dictionary<string, string>(); using (DepartmentBLL bll = new DepartmentBLL()) { OrganizationList = bll.GetFatherByDepartmentID(DepartID); } Tracer.Debug("FormID=" + user.FormID + ";继续查找部门的上级机构"); if (OrganizationList == null || OrganizationList.Count <= 0) { string info = "FormID=" + user.FormID + ";没有找到所在部门的上级机构"; #region 写日志 if (user != null) { if (DepartID == user.DepartmentID) { info = "FormID=" + user.FormID + ";没有找到所在部门[ " + user.DepartmentName + " ]的上一级上级机构"; Tracer.Debug(info); } } #endregion throw new Exception("没有找到所在部门[ " + user.DepartmentName + " ]的上一级上级机构"); } foreach (var item in OrganizationList) { if (item.Value == "0") { xoml = FLOW_MODELFLOWRELATION_TDAL.GetFlowByModelName(CompanyID, item.Key, ModelCode, FlowType, "0"); //如果上级机构是公司直接查询公司关联流程并返回 #region 写日志 if (user.CompayID == CompanyID) { Tracer.Debug("FormID=" + user.FormID + ";找到所在部门[ " + user.DepartmentName + " ]的上一级上级机构 [" + user.CompayName + "]"); } else { Tracer.Debug("FormID=" + user.FormID + ";找到所在部门[ " + user.DepartmentName + " ]的上一级上级机构 "); } #endregion return xoml; } xoml = FLOW_MODELFLOWRELATION_TDAL.GetFlowByModelName(CompanyID, item.Key, ModelCode, FlowType, "1"); if (xoml != null && xoml.Count > 0) //找到匹配流程返回 { #region 写日志 if (user.CompayID == CompanyID) { Tracer.Debug("FormID=" + user.FormID + ";找到所在部门[ " + user.DepartmentName + " ]的上一级上级机构 [" + user.CompayName + "]"); } else { Tracer.Debug("FormID=" + user.FormID + ";找到所在部门[ " + user.DepartmentName + " ]的上一级上级机构 "); } #endregion return xoml; } } return xoml; } catch (Exception ex) { Tracer.Debug("FlowBLL->GetFlowByModelName:" + ex.Message); throw new Exception("GetFlowByModelName:" + ex.Message);// return null; } }
/// <summary> /// 发送审批消息(调用引擎服务) /// </summary> /// <param name="submitData"></param> /// <param name="dataResult"></param> /// <param name="sUser"></param> /// <param name="CheckFlowResult"></param> /// <param name="Flowbill"></param> /// <param name="AppCompanyID">申请公司</param> /// <param name="MessageUserID">申请人ID</param> /// <param name="MessageUserName">申请人名</param> private void SubmitEngineService(SubmitData submitData, DataResult dataResult, ref FlowUser sUser, CheckResult CheckFlowResult, FlowBLL Flowbill, string AppCompanyID, string MessageUserID, string MessageUserName, ref string ErroMessage) { bool bOK = true; #region 发送审批消息(调用引擎服务) try { if (dataResult.FlowResult == FlowResult.SUCCESS || dataResult.FlowResult == FlowResult.END) { #region 调用引擎服务(调用本地服DLL) string IsTask = dataResult.FlowResult == FlowResult.SUCCESS ? "1" : "0"; MessageData tmpMessageData = null; StringBuilder FlowResultXml = null; #region switch (submitData.SubmitFlag) { case SubmitFlag.New: #region 新增 if (dataResult.IsCountersign) { #region 会签 if (dataResult.FlowResult == FlowResult.SUCCESS) { List<string> listUserID = new List<string>(); List<string> listUserName = new List<string>(); if (dataResult.DictCounterUser != null && dataResult.DictCounterUser.Keys.Count > 0) { dataResult.DictCounterUser.Values.ToList().ForEach(users => { users.ForEach(user => { listUserID.Add(user.UserID); listUserName.Add(user.UserName); }); }); MessageUserID = string.Join("|", listUserID); MessageUserName = string.Join("|", listUserName); } } if (dataResult.DictAgentUserInfo != null && dataResult.DictAgentUserInfo.Count > 0) { dataResult.DictAgentUserInfo.Values.ToList().ForEach(user => { MessageUserID += "|" + user.UserID.Trim(); MessageUserName += "|" + user.UserName.Trim(); }); } #endregion } else { #region 非会签(多个人时,只取其中一个) if (dataResult.FlowResult == FlowResult.SUCCESS) { MessageUserID = dataResult.UserInfo[0].UserID.Trim(); MessageUserName = dataResult.UserInfo[0].UserName.Trim(); } if (dataResult.AgentUserInfo != null) { MessageUserID += "|" + dataResult.AgentUserInfo.UserID.Trim(); MessageUserName += "|" + dataResult.AgentUserInfo.UserName.Trim(); } #endregion } tmpMessageData = new MessageData("Flow", sUser.SysCode, AppCompanyID, submitData.ModelCode, sUser.ModelName, submitData.FormID, dataResult.AppState, dataResult.CheckState, IsTask, MessageUserID, MessageUserName, dataResult.KPITime); FlowResultXml = Flowbill.BuildMessageData(tmpMessageData); sUser.TrackingMessage += "流程引擎的XML数据新增: FormID=" + submitData.FormID + ";SysCode=" + sUser.SysCode + " ModelName=" + sUser.ModelName + "\r\n FlowResultXml= \r\n" + FlowResultXml + "\r\n submitData.XML= \r\n" + submitData.XML; bOK = einginBll.SaveFlowTriggerData(submitData, FlowResultXml.ToString(), submitData.XML, ref sUser, ref ErroMessage); sUser.TrackingMessage += "触发流程返回的结果 bOK=" + bOK.ToString() + "\r\n"; sUser.TrackingMessage += "结束新增 FormID=" + submitData.FormID + " FlowEngine.SaveFlowTriggerData\r\n"; if (!bOK) { Tracer.Debug("触发流程返回的结果 bOK=" + bOK.ToString() + " FormID=" + submitData.FormID + "\r\nFlowResultXml=" + FlowResultXml.ToString() + "\r\n submitDataXML=" + submitData.XML); } #endregion break; case SubmitFlag.Cancel: #region 撤单 tmpMessageData = new MessageData("Flow", sUser.SysCode, AppCompanyID, submitData.ModelCode, sUser.ModelName, submitData.FormID, dataResult.AppState, dataResult.CheckState, IsTask, MessageUserID, MessageUserName, dataResult.KPITime); FlowResultXml = Flowbill.BuildMessageData(tmpMessageData); //bool bCancel = FlowEngine.FlowCancel(FlowResultXml.ToString(), submitData.XML); sUser.TrackingMessage += "流程引擎的XML数据新增: FormID=" + submitData.FormID + ";SysCode=" + sUser.SysCode + " ModelName=" + sUser.ModelName + "\r\n FlowResultXml= \r\n" + FlowResultXml + "\r\n submitData.XML= \r\n" + submitData.XML; bool bCancel = einginBll.FlowCancel(submitData, FlowResultXml.ToString(), submitData.XML, ref ErroMessage); if (!bCancel) { Tracer.Debug("触发流程返回的结果 bCancel=" + bCancel.ToString() + " FormID=" + submitData.FormID + "\r\nFlowResultXml=" + FlowResultXml.ToString() + "\r\n submitDataXML=" + submitData.XML); } #endregion break; case SubmitFlag.Approval: #region 审核 //FlowEngine.TaskMsgClose(modelinfo.SysCode, submitData.FormID, submitData.ApprovalUser.UserID); einginBll.TaskMsgClose(sUser.SysCode, submitData.FormID, submitData.ApprovalUser.UserID); if (dataResult.CurrentIsCountersign) { #region 会签 if (submitData.ApprovalResult == ApprovalResult.NoPass) { #region 审核不通过 List<string> listMessageUserID = new List<string>(); CheckFlowResult.fd.Where(detail => detail.EDITUSERID != submitData.ApprovalUser.UserID).ToList().ForEach(item => { listMessageUserID.Add(item.EDITUSERID); if (!string.IsNullOrEmpty(item.AGENTUSERID)) { listMessageUserID.Add(item.AGENTUSERID); } }); if (listMessageUserID.Count > 0) { string messageUserID = string.Join(",", listMessageUserID); //FlowEngine.TaskMsgClose(modelinfo.SysCode, submitData.FormID, messageUserID); einginBll.TaskMsgClose(sUser.SysCode, submitData.FormID, messageUserID); } tmpMessageData = new MessageData("Flow", sUser.SysCode, AppCompanyID, submitData.ModelCode, sUser.ModelName, submitData.FormID, dataResult.AppState, dataResult.CheckState, IsTask, MessageUserID, MessageUserName, dataResult.KPITime); FlowResultXml = Flowbill.BuildMessageData(tmpMessageData); //bOK = FlowEngine.SaveFlowTriggerData(FlowResultXml.ToString(), submitData.XML); Tracer.Debug("开始审核FlowEngine.SaveFlowTriggerData FormID=" + submitData.FormID + ""); Tracer.Debug("流程引擎的XML数据 审核: FormID=" + submitData.FormID + ";SysCode=" + sUser.SysCode + " ModelName=" + sUser.ModelName + "\r\n FlowResultXml= \r\n" + FlowResultXml + "\r\n submitData.XML= \r\n" + submitData.XML); bOK = einginBll.SaveFlowTriggerData(submitData, FlowResultXml.ToString(), submitData.XML, ref sUser, ref ErroMessage); Tracer.Debug("bOK=" + bOK.ToString()); Tracer.Debug("结束审核FlowEngine.SaveFlowTriggerData FormID=" + submitData.FormID + ""); if (!bOK) { Tracer.Debug("FlowEngineService:FormID=" + submitData.FormID + "\r\nFlowResultXml=" + FlowResultXml.ToString() + "\r\n submitDataXML=" + submitData.XML); } #endregion } else if (dataResult.IsGotoNextState) { #region 到下一状态 List<string> listMessageUserID = new List<string>(); CheckFlowResult.fd.Where(detail => detail.EDITUSERID != submitData.ApprovalUser.UserID).ToList().ForEach(item => { listMessageUserID.Add(item.EDITUSERID); if (!string.IsNullOrEmpty(item.AGENTUSERID)) { listMessageUserID.Add(item.AGENTUSERID); } }); if (listMessageUserID.Count > 0) { string messageUserID = string.Join(",", listMessageUserID); // FlowEngine.TaskMsgClose(modelinfo.SysCode, submitData.FormID, messageUserID); einginBll.TaskMsgClose(sUser.SysCode, submitData.FormID, messageUserID); } if (dataResult.IsCountersign) { #region if (dataResult.FlowResult == FlowResult.SUCCESS) { List<string> listUserID = new List<string>(); List<string> listUserName = new List<string>(); if (dataResult.DictCounterUser != null && dataResult.DictCounterUser.Keys.Count > 0) { dataResult.DictCounterUser.Values.ToList().ForEach(users => { users.ForEach(user => { listUserID.Add(user.UserID); listUserName.Add(user.UserName); }); }); MessageUserID = string.Join("|", listUserID); MessageUserName = string.Join("|", listUserName); } } if (dataResult.DictAgentUserInfo != null && dataResult.DictAgentUserInfo.Count > 0) { dataResult.DictAgentUserInfo.Values.ToList().ForEach(user => { MessageUserID += "|" + user.UserID.Trim(); MessageUserName += "|" + user.UserName.Trim(); }); } #endregion } else { #region if (dataResult.FlowResult == FlowResult.SUCCESS) { MessageUserID = dataResult.UserInfo[0].UserID.Trim(); MessageUserName = dataResult.UserInfo[0].UserName.Trim(); } if (dataResult.AgentUserInfo != null) { MessageUserID += "|" + dataResult.AgentUserInfo.UserID.Trim(); MessageUserName += "|" + dataResult.AgentUserInfo.UserName.Trim(); } #endregion } tmpMessageData = new MessageData("Flow", sUser.SysCode, AppCompanyID, submitData.ModelCode, sUser.ModelName, submitData.FormID, dataResult.AppState, dataResult.CheckState, IsTask, MessageUserID, MessageUserName, dataResult.KPITime); FlowResultXml = Flowbill.BuildMessageData(tmpMessageData); bOK = einginBll.SaveFlowTriggerData(submitData, FlowResultXml.ToString(), submitData.XML, ref sUser, ref ErroMessage); if (!bOK) { Tracer.Debug("FlowEngineService:FormID=" + submitData.FormID + "\r\nFlowResultXml=" + FlowResultXml.ToString() + "\r\n submitDataXML=" + submitData.XML); } #endregion } #endregion } else { #region 非会签 if (dataResult.IsCountersign) { #region if (dataResult.FlowResult == FlowResult.SUCCESS) { List<string> listUserID = new List<string>(); List<string> listUserName = new List<string>(); if (dataResult.DictCounterUser != null && dataResult.DictCounterUser.Keys.Count > 0) { dataResult.DictCounterUser.Values.ToList().ForEach(users => { users.ForEach(user => { listUserID.Add(user.UserID); listUserName.Add(user.UserName); }); }); MessageUserID = string.Join("|", listUserID); MessageUserName = string.Join("|", listUserName); } } if (dataResult.DictAgentUserInfo != null && dataResult.DictAgentUserInfo.Count > 0) { dataResult.DictAgentUserInfo.Values.ToList().ForEach(user => { MessageUserID += "|" + user.UserID.Trim(); MessageUserName += "|" + user.UserName.Trim(); }); } #endregion } else { #region if (dataResult.FlowResult == FlowResult.SUCCESS) { MessageUserID = dataResult.UserInfo[0].UserID.Trim(); MessageUserName = dataResult.UserInfo[0].UserName.Trim(); } if (dataResult.AgentUserInfo != null) { MessageUserID += "|" + dataResult.AgentUserInfo.UserID.Trim(); MessageUserName += "|" + dataResult.AgentUserInfo.UserName.Trim(); } #endregion } tmpMessageData = new MessageData("Flow", sUser.SysCode, AppCompanyID, submitData.ModelCode, sUser.ModelName, submitData.FormID, dataResult.AppState, dataResult.CheckState, IsTask, MessageUserID, MessageUserName, dataResult.KPITime); FlowResultXml = Flowbill.BuildMessageData(tmpMessageData); sUser.TrackingMessage += "流程引擎的XML数据新增: FormID=" + submitData.FormID + ";SysCode=" + sUser.SysCode + " ModelName=" + sUser.ModelName + "\r\n FlowResultXml= \r\n" + FlowResultXml + "\r\n submitData.XML= \r\n" + submitData.XML; bOK = einginBll.SaveFlowTriggerData(submitData, FlowResultXml.ToString(), submitData.XML, ref sUser, ref ErroMessage); if (!bOK) { Tracer.Debug("触发流程返回的结果 bOK=" + bOK.ToString() + " FormID=" + submitData.FormID + "\r\nFlowResultXml=" + FlowResultXml.ToString() + "\r\n submitDataXML=" + submitData.XML); } #endregion } #endregion break; } #endregion #endregion 调用引擎服务(调用本地服DLL) } } catch (Exception ex) { //Tracer.Debug("FlowEngineService: -" + "\n\nError:" + ex.InnerException + ex.Message); Tracer.Debug("发送审批消息FORMID=" + sUser.FormID + " 异常信息:" + ex.ToString() + "\r\n"); if (string.IsNullOrEmpty(ErroMessage)) { throw new Exception("发送审批消息失败,请联系管理员!"); } else { throw new Exception(ErroMessage); } } #endregion }
/// <summary> /// 自选流程使用:流程数据处理(对应SubmitFlow)对数据库操作 /// </summary> /// <param name="workflowRuntime"></param> /// <param name="instance"></param> /// <param name="entity"></param> /// <param name="NextStateCode"></param> /// <param name="EditUserId"></param> /// <param name="EditUserName"></param> /// <param name="SubmitFlag"></param> /// <param name="FlowType"></param> /// <returns></returns> public DataResult DoFlowRecord( WorkflowRuntime workflowRuntime, WorkflowInstance instance, FLOW_FLOWRECORDDETAIL_T entity, string NextStateCode, UserInfo AppUser, UserInfo AgentUser, SubmitFlag SubmitFlag, FlowType FlowType,ref FlowUser fUser) { DataResult tmpDataResult = new DataResult(); UserInfo tmpUserInfo = AppUser; //tmpUserInfo.UserID = EditUserId; //tmpUserInfo.UserName = EditUserName; tmpDataResult.UserInfo.Add(tmpUserInfo); try { if (SubmitFlag == SubmitFlag.New) { #region 新增流程 //添加启动状态 entity.FLOW_FLOWRECORDMASTER_T.FLOWRECORDMASTERID = Guid.NewGuid().ToString(); entity.FLOW_FLOWRECORDMASTER_T.CHECKSTATE = "1"; entity.FLOW_FLOWRECORDMASTER_T.CREATECOMPANYID = entity.CREATECOMPANYID; entity.FLOW_FLOWRECORDMASTER_T.CREATEDEPARTMENTID = entity.CREATEDEPARTMENTID; entity.FLOW_FLOWRECORDMASTER_T.CREATEPOSTID = entity.CREATEPOSTID; entity.FLOW_FLOWRECORDMASTER_T.CREATEUSERID = entity.CREATEUSERID; entity.FLOW_FLOWRECORDMASTER_T.CREATEUSERNAME = entity.CREATEUSERNAME; entity.FLOW_FLOWRECORDMASTER_T.EDITUSERID = entity.CREATEUSERID; entity.FLOW_FLOWRECORDMASTER_T.EDITUSERNAME = entity.CREATEUSERNAME; entity.FLOW_FLOWRECORDMASTER_T.CREATEDATE = DateTime.Now; entity.FLOWRECORDDETAILID = Guid.NewGuid().ToString(); // entity.FLOW_FLOWRECORDMASTER_T .INSTANCEID = instance.InstanceId.ToString(); entity.FLAG = "1"; entity.CHECKSTATE = "1"; //entity.FlowCode = "TestFlow"; //正式使用时关屏蔽 entity.STATECODE = "StartFlow"; entity.PARENTSTATEID = entity.FLOWRECORDDETAILID; entity.CREATEDATE = DateTime.Now; entity.EDITDATE = DateTime.Now; entity.EDITUSERID = entity.CREATEUSERID; entity.EDITUSERNAME = entity.CREATEUSERNAME; entity.EDITCOMPANYID = entity.CREATECOMPANYID; entity.EDITDEPARTMENTID = entity.CREATEDEPARTMENTID; entity.EDITPOSTID = entity.CREATEPOSTID; #region 引擎自动提交时停留在提交人处 if (FlowType == FlowType.Pending) { entity.FLAG = "0"; entity.EDITUSERID = AppUser.UserID; entity.EDITUSERNAME = AppUser.UserName; entity.EDITCOMPANYID = AppUser.CompanyID; entity.EDITDEPARTMENTID = AppUser.DepartmentID; entity.EDITPOSTID = AppUser.PostID; FLOW_FLOWRECORDMASTER_TDAL.Add( entity.FLOW_FLOWRECORDMASTER_T);//对数据库操作 fUser.NextEditUserID = entity.EDITUSERID; fUser.NextEditUserName = entity.EDITUSERNAME; AddFlowDetailRecord( entity, NextStateCode, AppUser.UserID); tmpDataResult.FlowResult = FlowResult.SUCCESS; tmpDataResult.CheckState = "1"; return tmpDataResult; } #endregion FLOW_FLOWRECORDMASTER_TDAL.Add( entity.FLOW_FLOWRECORDMASTER_T);//对数据库操作 fUser.NextEditUserID = entity.EDITUSERID; fUser.NextEditUserName = entity.EDITUSERNAME; AddFlowDetailRecord( entity, NextStateCode, AppUser.UserID); FLOW_FLOWRECORDDETAIL_T entity2 = new FLOW_FLOWRECORDDETAIL_T(); //添加下一状态 entity2.FLOWRECORDDETAILID = Guid.NewGuid().ToString(); entity2.FLOW_FLOWRECORDMASTER_T = entity.FLOW_FLOWRECORDMASTER_T; entity2.STATECODE = NextStateCode == "" ? SMTWorkFlowManage.GetNextState(workflowRuntime, instance, entity.STATECODE) : NextStateCode; entity2.PARENTSTATEID = entity.FLOWRECORDDETAILID;//entity.StateCode; //entity2.Content = "."; entity2.FLAG = "0"; entity2.CHECKSTATE = "2"; entity2.CREATEPOSTID = entity.CREATEPOSTID; entity2.CREATECOMPANYID = entity.CREATECOMPANYID; entity2.CREATEDEPARTMENTID = entity.CREATEDEPARTMENTID; entity2.CREATEUSERID = entity.EDITUSERID; entity2.CREATEUSERNAME = entity.EDITUSERNAME; entity2.CREATEDATE = DateTime.Now; entity2.EDITUSERID = AppUser.UserID; entity2.EDITUSERNAME = AppUser.UserName; entity2.EDITCOMPANYID = AppUser.CompanyID; entity2.EDITDEPARTMENTID = AppUser.DepartmentID; entity2.EDITPOSTID = AppUser.PostID; entity2.EDITDATE = DateTime.Now; if (AgentUser != null) //如果启用了代理,把代理人信息写入 { entity2.AGENTUSERID = AgentUser.UserID; entity2.AGENTERNAME = AgentUser.UserName; entity2.AGENTEDITDATE = DateTime.Now; } tmpDataResult.AppState = entity2.STATECODE; if (entity2.STATECODE != "EndFlow") { fUser.NextEditUserID = entity2.EDITUSERID; fUser.NextEditUserName = entity2.EDITUSERNAME; AddFlowDetailRecord( entity2, NextStateCode, AppUser.UserID);//对数据库操作 tmpDataResult.FlowResult = FlowResult.SUCCESS; tmpDataResult.CheckState = "1"; } else { tmpDataResult.CheckState = "2"; tmpDataResult.FlowResult = FlowResult.END; //如果没有下一处理节点,则返回END } return tmpDataResult; #endregion } else { #region 更新流程 //如果NextStateCode为空则自动获取模型中的下一状态,如果不为空则使用传入状态代码,并使用传入下一任务人ID //更新本流程 entity = UpdateFlowDetailRecord( entity, NextStateCode, AppUser.UserID);//对数据库操作 //添加下一状态 FLOW_FLOWRECORDDETAIL_T entity2 = new FLOW_FLOWRECORDDETAIL_T(); //添加下一状态 entity2.FLOWRECORDDETAILID = Guid.NewGuid().ToString(); if (NextStateCode != "") { entity2.STATECODE = NextStateCode; //entity2.EditUserID = EditUserId; //entity2.EditUserName = EditUserName; } else { entity2.STATECODE = SMTWorkFlowManage.GetNextState(workflowRuntime, instance, entity.STATECODE); // entity2.EditUserID = entity2.StateCode=="EndFlow" ? "" : "EditUserId"; //根据状态查询权限表中用户ID } if (entity2.STATECODE == "EndFlow") { entity.FLOW_FLOWRECORDMASTER_T.CHECKSTATE = "2"; //设为终审通过 if (entity.EDITDATE == entity.AGENTEDITDATE) //代理审核时 { entity.FLOW_FLOWRECORDMASTER_T.EDITUSERID = entity.AGENTUSERID; entity.FLOW_FLOWRECORDMASTER_T.EDITUSERNAME = entity.AGENTERNAME; } else //正常审核时 { entity.FLOW_FLOWRECORDMASTER_T.EDITUSERID = entity.EDITUSERID; entity.FLOW_FLOWRECORDMASTER_T.EDITUSERNAME = entity.EDITUSERNAME; } entity.FLOW_FLOWRECORDMASTER_T.EDITDATE = DateTime.Now; UpdateFlowDetailRecord( entity, NextStateCode, AppUser.UserID);//对数据库操作 FLOW_FLOWRECORDMASTER_TDAL.Update(entity.FLOW_FLOWRECORDMASTER_T);//对数据库操作 } entity2.PARENTSTATEID = entity.FLOWRECORDDETAILID;// entity.StateCode; //entity2.Content = ""; entity2.FLAG = "0"; entity2.CHECKSTATE = "2"; entity2.CREATEPOSTID = entity.CREATEPOSTID; entity2.CREATECOMPANYID = entity.CREATECOMPANYID; entity2.CREATEDEPARTMENTID = entity.CREATEDEPARTMENTID; //if (entity.EDITDATE == entity.AGENTEDITDATE) //代理审核时 //{ // entity2.CREATEUSERID = entity.AGENTUSERID; // entity2.CREATEUSERNAME = entity.AGENTERNAME; //} //else //正常审核时 //{ entity2.CREATEUSERID = entity.EDITUSERID; entity2.CREATEUSERNAME = entity.EDITUSERNAME; //} entity2.EDITUSERID = AppUser.UserID; entity2.EDITUSERNAME = AppUser.UserName; entity2.EDITCOMPANYID = AppUser.CompanyID; entity2.EDITDEPARTMENTID = AppUser.DepartmentID; entity2.EDITPOSTID = AppUser.PostID; entity2.CREATEDATE = DateTime.Now; entity2.EDITDATE = DateTime.Now; if (AgentUser != null) //如果启用了代理,把代理人信息写入 { entity2.AGENTUSERID = AgentUser.UserID; entity2.AGENTERNAME = AgentUser.UserName; entity2.AGENTEDITDATE = DateTime.Now; } tmpDataResult.AppState = entity2.STATECODE; if (entity2.STATECODE != "EndFlow") { entity2.FLOW_FLOWRECORDMASTER_T = entity.FLOW_FLOWRECORDMASTER_T; fUser.NextEditUserID = entity2.EDITUSERID; fUser.NextEditUserName = entity2.EDITUSERNAME; AddFlowDetailRecord( entity2, NextStateCode, AppUser.UserID);//对数据库操作 tmpDataResult.FlowResult = FlowResult.SUCCESS; tmpDataResult.CheckState = "1"; } else { tmpDataResult.FlowResult = FlowResult.END; //如果没有下一处理节点,则返回END tmpDataResult.CheckState = "2"; } return tmpDataResult; //如有下一节点,返回SUCCESS #endregion } } catch (Exception ex) { Tracer.Debug("提交自选流程数据出错,DoFlowRecord异常信息 :" + ex.ToString()); throw new Exception("提交自选流程数据出错!请联系管理员!"); //tmpDataResult.FlowResult = FlowResult.FAIL; //tmpDataResult.Err = ex.Message; //return tmpDataResult; } }
/// <summary> /// 自选流程审批(对服务操作) /// </summary> /// <param name="ApprovalData"></param> /// <param name="APPDataResult"></param> /// <returns></returns> public DataResult SubmitFreeFlow(SubmitData ApprovalData, DataResult APPDataResult, ref FlowUser user) { // WorkflowRuntime workflowRuntime = null; WorkflowInstance instance = null; FLOW_FLOWRECORDDETAIL_T entity = new FLOW_FLOWRECORDDETAIL_T(); entity.FLOW_FLOWRECORDMASTER_T = new FLOW_FLOWRECORDMASTER_T(); UserInfo AppUser = new UserInfo(); //下一审核人 UserInfo AgentAppUser = new UserInfo(); //代理下一审核人 try { entity.FLOW_FLOWRECORDMASTER_T.BUSINESSOBJECT = ApprovalData.XML; entity.FLOW_FLOWRECORDMASTER_T.FORMID = ApprovalData.FormID; entity.FLOW_FLOWRECORDMASTER_T.MODELCODE = ApprovalData.ModelCode; // entity.FLOWRECORDDETAILID = FlowGUID; entity.CREATECOMPANYID = ApprovalData.ApprovalUser.CompanyID; entity.CREATEDEPARTMENTID = ApprovalData.ApprovalUser.DepartmentID; entity.CREATEPOSTID = ApprovalData.ApprovalUser.PostID; entity.CREATEUSERID = ApprovalData.ApprovalUser.UserID; entity.CREATEUSERNAME = ApprovalData.ApprovalUser.UserName; entity.FLOW_FLOWRECORDMASTER_T.FLOWTYPE = ((int)ApprovalData.FlowType).ToString(); entity.FLOW_FLOWRECORDMASTER_T.FLOWSELECTTYPE = ((int)ApprovalData.FlowSelectType).ToString(); entity.FLOW_FLOWRECORDMASTER_T.FLOWCODE = "FreeFlow"; workflowRuntime = SMTWorkFlowManage.CreateWorkFlowRuntime(true); instance = SMTWorkFlowManage.CreateFreeWorkflowInstance(workflowRuntime, "FreeFlow.xml");//自选流程使用 user.TrackingMessage += "自选流程使用 AddFreeFlow(try)创建工作流实例完成 ID=" + instance.InstanceId; entity.FLOW_FLOWRECORDMASTER_T.INSTANCEID = instance.InstanceId.ToString(); //下一审核人赋值 AppUser = ApprovalData.NextApprovalUser; APPDataResult.RunTime += "---DoFlowStart:" + DateTime.Now.ToString(); ApprovalData.NextStateCode = "Approval"; AgentAppUser = GetAgentUserInfo(ApprovalData.ModelCode, AppUser.UserID); //查询是否启用了代理人(对服务操作) if (AgentAppUser != null) { Tracer.Debug("查询 启用了代理人 FormID=" + user.FormID + " UserID=" + AgentAppUser.UserID); } else { Tracer.Debug("查询 没有启用了代理人 FormID=" + user.FormID + " AgentAppUser=null"); } APPDataResult = DoFlowRecord(workflowRuntime, instance, entity, ApprovalData.NextStateCode, AppUser, AgentAppUser, ApprovalData.SubmitFlag, ApprovalData.FlowType, ref user); //处理流程数据 APPDataResult.AgentUserInfo = AgentAppUser; APPDataResult.RunTime += "---DoFlowEnd:" + DateTime.Now.ToString(); Tracer.Debug("Formid=" + ApprovalData.FormID + ";自选流程工作流实例ID:" + instance.InstanceId.ToString()); return APPDataResult; } catch (Exception e) { user.ErrorMsg += "自选流程审批出错 FormID=" + ApprovalData.FormID + ";异常信息:\r\n" + e.ToString() + "\r\n"; Tracer.Debug("自选流程审批出错 FormID=" + ApprovalData.FormID + ";跟踪信息:\r\n" + user.TrackingMessage + "异常信息:\r\n" + e.ToString()); throw new Exception("自选流程审批出错,请联系管理员! \r\n FormID=" + user.FormID + ""); } finally { AppUser = null; AgentAppUser = null; entity = null; instance = null; SMTWorkFlowManage.ColseWorkFlowRuntime(workflowRuntime); } }
/// <summary> /// /// </summary> /// <param name="companyID"></param> /// <param name="WfRuntimeClone"></param> /// <param name="instanceClone"></param> /// <param name="Layout">从审核主表记录ACTIVEROLE字段获取</param> /// <param name="xml"></param> /// <param name="CurrentStateName">当前状态</param> /// <param name="UserID"></param> /// <param name="PostID"></param> /// <param name="FlowType"></param> /// <param name="DataResult"></param> public void GetUserByInstance2(string companyID, WorkflowRuntime WfRuntimeClone, WorkflowInstance instanceClone, string Layout, string xml, string CurrentStateName, List<string> UserID, List<string> PostID, FlowType FlowType, ref DataResult DataResult,ref FlowUser fUser) { WorkflowRuntime WfRuntime = null; WorkflowInstance Instance = null; List<UserInfo> AppUserInfo = null; string strNextState = CurrentStateName; bool IsCountersign = false; string CountersignType = "0"; //Role_UserType RuleName; //List<UserInfo> AppUserInfo = null; Dictionary<FlowRole, List<UserInfo>> DictCounterUser = null; try { if (!WfRuntimeClone.IsStarted) { WfRuntimeClone.StartRuntime(); } WfRuntime = SMTWorkFlowManage.CreateWorkFlowRuntime(false); Instance = SMTWorkFlowManage.CloneWorkflowInstance(WfRuntimeClone, instanceClone, WfRuntime); bool iscurruser = true; int testflag = 0; while (iscurruser) { testflag++; if (testflag > 10) { throw new Exception("循环处理流程超过10次,请联系系统管理员"); } #region strNextState = SMTWorkFlowManage.GetFlowNextStepRoles(WfRuntime, Instance, strNextState, xml); List<FlowRole> listRole = FlowUtility.GetRlueIdFromActivitID(Layout, strNextState, ref IsCountersign, ref CountersignType); if (listRole.Count == 0) { DataResult.Err = "没有找到对应角色"; DataResult.FlowResult = FlowResult.FAIL; return; } if (!IsCountersign) { #region string tmpPostID = listRole[0].UserType == "CREATEUSER" ? PostID[0] : PostID[1]; bool isHigher = false; AppUserInfo = TmGetUserByRoleId(listRole[0].RoleName, null, tmpPostID, ref isHigher); #region 打印审核人 string names = "\r\nFormID=" + fUser.FormID + ";=======打印审核人F(listRole[0].RoleName=" + listRole[0].RoleName + ";审核人数量=" + AppUserInfo.Count + ";isHigher=" + isHigher.ToString() + ")=======\r\n"; foreach (var user in AppUserInfo) { names += "CompanyID:" + user.CompanyID + "\r\n"; names += "DepartmentID:" + user.DepartmentID + "\r\n"; names += "PostID:" + user.PostID + "\r\n"; names += "UserID:" + user.UserID + "\r\n"; names += "CompanyName:" + user.CompanyName + "\r\n"; names += "DepartmentName:" + user.DepartmentName + "\r\n"; names += "PostName:" + user.PostName + "\r\n"; names += "UserName:"******"\r\n"; names += "----------------------------------------------------\r\n"; } if (!isHigher && listRole[0].IsOtherCompany != null) { if (listRole[0].IsOtherCompany.Value == true) { names += "是否指定公司:" + listRole[0].IsOtherCompany.Value.ToString() + "\r\n"; names += "公司的ID:" + listRole[0].OtherCompanyID + "\r\n"; if (string.IsNullOrEmpty(listRole[0].OtherCompanyID)) { names += "Layout=" + Layout + "\r\n"; } } else if (listRole[0].IsOtherCompany.Value == false) { names += "实际要查找公司的ID:" + companyID + "\r\n"; } } fUser.ErrorMsg += names; Tracer.Debug(names); #endregion #region beyond if (!isHigher && strNextState.ToUpper() != "ENDFLOW") { if (listRole[0].IsOtherCompany != null && listRole[0].IsOtherCompany.Value == true) { AppUserInfo = AppUserInfo.Where(user => user.CompanyID == listRole[0].OtherCompanyID).ToList(); } else { AppUserInfo = AppUserInfo.Where(user => user.CompanyID == companyID).ToList(); } } #endregion if (AppUserInfo == null || AppUserInfo.Count == 0) { DataResult.Err = "当前角色 " + listRole[0].Remark + " 没有找到审核人" ; DataResult.FlowResult = FlowResult.FAIL; return; } if (AppUserInfo.Where(c => c.UserID == UserID[1]).Count() == 0) iscurruser = false; #endregion } else { #region DictCounterUser = new Dictionary<FlowRole, List<UserInfo>>(); if (CountersignType == "0") { #region for (int i = 0; i < listRole.Count; i++) { string tmpPostID = listRole[i].UserType == "CREATEUSER" ? PostID[0] : PostID[1]; bool isHigher = false; var listuserinfo = TmGetUserByRoleId(listRole[i].RoleName, null, tmpPostID, ref isHigher); #region 打印审核人 string names = "\r\n=======打印审核人G(listRole[i].RoleName=" + listRole[0].RoleName + ";UserID=" + UserID + ";PostID=" + PostID + ";isHigher=" + isHigher.ToString() + ")=======\r\n"; foreach (var user in listuserinfo) { names += "CompanyID:" + user.CompanyID + "\r\n"; names += "DepartmentID:" + user.DepartmentID + "\r\n"; names += "PostID:" + user.PostID + "\r\n"; names += "UserID:" + user.UserID + "\r\n"; names += "CompanyName:" + user.CompanyName + "\r\n"; names += "DepartmentName:" + user.DepartmentName + "\r\n"; names += "PostName:" + user.PostName + "\r\n"; names += "UserName:"******"\r\n"; names += "----------------------------------------------------\r\n"; } if (!isHigher && listRole[0].IsOtherCompany != null) { if (listRole[0].IsOtherCompany.Value == true) { names += "是否指定公司:" + listRole[0].IsOtherCompany.Value.ToString() + "\r\n"; names += "公司的ID:" + listRole[0].OtherCompanyID + "\r\n"; if (string.IsNullOrEmpty(listRole[0].OtherCompanyID)) { names += "Layout=" + Layout + "\r\n"; } } else if (listRole[0].IsOtherCompany.Value == false) { names += "实际要查找公司的ID:" + companyID + "\r\n"; } } fUser.ErrorMsg += names; Tracer.Debug(names); #endregion if (!isHigher) { if (listRole[i].IsOtherCompany != null && listRole[i].IsOtherCompany.Value == true) { listuserinfo = listuserinfo.Where(user => user.CompanyID == listRole[i].OtherCompanyID).ToList(); } else { listuserinfo = listuserinfo.Where(user => user.CompanyID == companyID).ToList(); } } if (listuserinfo == null || listuserinfo.Count == 0) { DataResult.Err = "角色 " + listRole[i].Remark + "没有找到审核人"; DataResult.FlowResult = FlowResult.FAIL; return; } DictCounterUser.Add(listRole[i], listuserinfo); } iscurruser = false; #endregion } else { #region string roleNames = "";//所有角色名称 iscurruser = false; bool bFlag = false; for (int i = 0; i < listRole.Count; i++) { roleNames += listRole[i].Remark + "、"; string tmpPostID = listRole[i].UserType == "CREATEUSER" ? PostID[0] : PostID[1]; bool isHigher = false; var listuserinfo = TmGetUserByRoleId(listRole[i].RoleName, null, tmpPostID, ref isHigher); #region 打印审核人 string names = "\r\n=======打印审核人H(listRole[0].RoleName=" + listRole[i].RoleName + ";UserID=" + UserID + ";PostID=" + tmpPostID + ";isHigher=" + isHigher.ToString() + ")=======\r\n"; foreach (var user in listuserinfo) { names += "CompanyID:" + user.CompanyID + "\r\n"; names += "DepartmentID:" + user.DepartmentID + "\r\n"; names += "PostID:" + user.PostID + "\r\n"; names += "UserID:" + user.UserID + "\r\n"; names += "CompanyName:" + user.CompanyName + "\r\n"; names += "DepartmentName:" + user.DepartmentName + "\r\n"; names += "PostName:" + user.PostName + "\r\n"; names += "UserName:"******"\r\n"; names += "----------------------------------------------------\r\n"; } if (!isHigher && listRole[0].IsOtherCompany != null) { if (listRole[0].IsOtherCompany.Value == true) { names += "是否指定公司:" + listRole[0].IsOtherCompany.Value.ToString() + "\r\n"; names += "公司的ID:" + listRole[0].OtherCompanyID + "\r\n"; if (string.IsNullOrEmpty(listRole[0].OtherCompanyID)) { names += "Layout=" + Layout + "\r\n"; } } else if (listRole[0].IsOtherCompany.Value == false) { names += "实际要查找公司的ID:" + companyID + "\r\n"; } } fUser.ErrorMsg += names; Tracer.Debug(names); #endregion if (!isHigher) { if (listRole[i].IsOtherCompany != null && listRole[i].IsOtherCompany.Value == true) { listuserinfo = listuserinfo.Where(user => user.CompanyID == listRole[i].OtherCompanyID).ToList(); } else { listuserinfo = listuserinfo.Where(user => user.CompanyID == companyID).ToList(); } } if (listuserinfo != null && listuserinfo.Count > 0) { bFlag = true; if (listuserinfo.FirstOrDefault(u => u.UserID == UserID[1]) != null) { iscurruser = true; break; } //DataResult.Err = "没有找到审核人"; //DataResult.FlowResult = FlowResult.FAIL; //return; } DictCounterUser.Add(listRole[i], listuserinfo); } if (!bFlag) { DataResult.Err = "当前的角色 " + roleNames + " 没有找到审核人"; DataResult.FlowResult = FlowResult.FAIL; return; } #endregion } #endregion } #endregion } DataResult.IsCountersign = IsCountersign; DataResult.AppState = strNextState; DataResult.CountersignType = CountersignType; if (!IsCountersign) { #region if (AppUserInfo != null && AppUserInfo.Count > 1) //处理角色对应多个用户,返回用户集给提交人,选择一个处理人 { DataResult.FlowResult = FlowResult.MULTIUSER; } DataResult.UserInfo = AppUserInfo; #endregion } else { #region if (DataResult.DictCounterUser == null) { DataResult.DictCounterUser = new Dictionary<FlowRole, List<UserInfo>>(); } DataResult.DictCounterUser = DictCounterUser; List<FlowRole> listkeys = DictCounterUser.Keys.ToList(); for (int i = 0; i < listkeys.Count; i++) { FlowRole key = listkeys[i]; if (DictCounterUser[key].Count > 1) { DataResult.FlowResult = FlowResult.Countersign; break; } } #endregion } } catch (Exception ex) { //throw new Exception("GetUserByInstance2:" + ex.Message);//旧的 Tracer.Debug("FORMID="+fUser.FormID+";通过实体例查找用户Instance=" + Instance.InstanceId.ToString()+" 异常信息:\r\n" + ex.ToString()); throw new Exception(ex.Message); } finally { strNextState = null; AppUserInfo = null; //RuleName = null; Instance = null; SMTWorkFlowManage.ColseWorkFlowRuntime(WfRuntime); } }
/// <summary> /// 非会签是使用 /// </summary> /// <param name="con"></param> /// <param name="workflowRuntime"></param> /// <param name="instance"></param> /// <param name="entity"></param> /// <param name="NextStateCode"></param> /// <param name="AppUser"></param> /// <param name="AgentUser"></param> /// <param name="SubmitFlag"></param> /// <param name="FlowType"></param> /// <returns></returns> public DataResult AddOrUpdateFlowRecord( WorkflowRuntime workflowRuntime, WorkflowInstance instance, FLOW_FLOWRECORDDETAIL_T entity, string NextStateCode, UserInfo AppUser, UserInfo AgentUser, SubmitFlag SubmitFlag, FlowType FlowType,ref FlowUser fUser) { DataResult tmpDataResult = new DataResult(); UserInfo tmpUserInfo = AppUser; tmpDataResult.UserInfo.Add(tmpUserInfo); try { if (SubmitFlag == SubmitFlag.New) { #region 新增流程 //添加启动状态 if (SubmitFlag == FlowWFService.SubmitFlag.New) { entity.FLOW_FLOWRECORDMASTER_T.FLOWRECORDMASTERID = Guid.NewGuid().ToString(); } entity.FLOW_FLOWRECORDMASTER_T.CHECKSTATE = "1"; entity.FLOW_FLOWRECORDMASTER_T.CREATECOMPANYID = entity.CREATECOMPANYID; entity.FLOW_FLOWRECORDMASTER_T.CREATEDEPARTMENTID = entity.CREATEDEPARTMENTID; entity.FLOW_FLOWRECORDMASTER_T.CREATEPOSTID = entity.CREATEPOSTID; entity.FLOW_FLOWRECORDMASTER_T.CREATEUSERID = entity.CREATEUSERID; entity.FLOW_FLOWRECORDMASTER_T.CREATEUSERNAME = entity.CREATEUSERNAME; entity.FLOW_FLOWRECORDMASTER_T.EDITUSERID = entity.CREATEUSERID; entity.FLOW_FLOWRECORDMASTER_T.EDITUSERNAME = entity.CREATEUSERNAME; entity.FLOW_FLOWRECORDMASTER_T.CREATEDATE = DateTime.Now; entity.FLOWRECORDDETAILID = Guid.NewGuid().ToString(); // entity.FLOW_FLOWRECORDMASTER_T .INSTANCEID = instance.InstanceId.ToString(); entity.FLAG = "1"; entity.CHECKSTATE = "1"; //entity.FlowCode = "TestFlow"; //正式使用时关屏蔽 entity.STATECODE = "StartFlow"; entity.PARENTSTATEID = entity.FLOWRECORDDETAILID; entity.CREATEDATE = DateTime.Now; entity.EDITDATE = DateTime.Now; entity.EDITUSERID = entity.CREATEUSERID; entity.EDITUSERNAME = entity.CREATEUSERNAME; entity.EDITCOMPANYID = entity.CREATECOMPANYID; entity.EDITDEPARTMENTID = entity.CREATEDEPARTMENTID; entity.EDITPOSTID = entity.CREATEPOSTID; #region 引擎自动提交时停留在提交人处 if (FlowType == FlowType.Pending) { entity.FLAG = "0"; entity.EDITUSERID = AppUser.UserID; entity.EDITUSERNAME = AppUser.UserName; entity.EDITCOMPANYID = AppUser.CompanyID; entity.EDITDEPARTMENTID = AppUser.DepartmentID; entity.EDITPOSTID = AppUser.PostID; fUser.NextEditUserID = entity.EDITUSERID; fUser.NextEditUserName = entity.EDITUSERNAME; FLOW_FLOWRECORDMASTER_TDAL.Add( entity.FLOW_FLOWRECORDMASTER_T); AddFlowDetailRecord( entity, NextStateCode, AppUser.UserID); tmpDataResult.FlowResult = FlowResult.SUCCESS; tmpDataResult.CheckState = "1"; return tmpDataResult; } #endregion FLOW_FLOWRECORDMASTER_TDAL.Add( entity.FLOW_FLOWRECORDMASTER_T); fUser.NextEditUserID = entity.EDITUSERID; fUser.NextEditUserName = entity.EDITUSERNAME; AddFlowDetailRecord( entity, NextStateCode, AppUser.UserID); FLOW_FLOWRECORDDETAIL_T entDetail = new FLOW_FLOWRECORDDETAIL_T(); //添加下一状态 entDetail.FLOWRECORDDETAILID = Guid.NewGuid().ToString(); entDetail.FLOW_FLOWRECORDMASTER_T = entity.FLOW_FLOWRECORDMASTER_T; entDetail.STATECODE = NextStateCode == "" ? SMTWorkFlowManage.GetNextState(workflowRuntime, instance, entity.STATECODE) : NextStateCode; entDetail.PARENTSTATEID = entity.FLOWRECORDDETAILID;//entity.StateCode; //entity2.Content = "."; entDetail.FLAG = "0"; entDetail.CHECKSTATE = "2"; entDetail.CREATEPOSTID = entity.CREATEPOSTID; entDetail.CREATECOMPANYID = entity.CREATECOMPANYID; entDetail.CREATEDEPARTMENTID = entity.CREATEDEPARTMENTID; entDetail.CREATEUSERID = entity.EDITUSERID; entDetail.CREATEUSERNAME = entity.EDITUSERNAME; entDetail.CREATEDATE = DateTime.Now; entDetail.EDITUSERID = AppUser.UserID; entDetail.EDITUSERNAME = AppUser.UserName; entDetail.EDITCOMPANYID = AppUser.CompanyID; entDetail.EDITDEPARTMENTID = AppUser.DepartmentID; entDetail.EDITPOSTID = AppUser.PostID; entDetail.EDITDATE = DateTime.Now; if (AgentUser != null) //如果启用了代理,把代理人信息写入 { entDetail.AGENTUSERID = AgentUser.UserID; entDetail.AGENTERNAME = AgentUser.UserName; entDetail.AGENTEDITDATE = DateTime.Now; } tmpDataResult.AppState = entDetail.STATECODE; if (entDetail.STATECODE != "EndFlow") { fUser.NextEditUserID = entDetail.EDITUSERID; fUser.NextEditUserName = entDetail.EDITUSERNAME; AddFlowDetailRecord( entDetail, NextStateCode, AppUser.UserID); tmpDataResult.FlowResult = FlowResult.SUCCESS; tmpDataResult.CheckState = "1"; } else { tmpDataResult.CheckState = "2"; tmpDataResult.FlowResult = FlowResult.END; //如果没有下一处理节点,则返回END } tmpDataResult.IsCountersignComplete = true; return tmpDataResult; #endregion } else { #region 更新流程 //如果NextStateCode为空则自动获取模型中的下一状态,如果不为空则使用传入状态代码,并使用传入下一任务人ID //更新本流程 entity = UpdateFlowDetailRecord( entity, NextStateCode, AppUser.UserID); string stateCode = ""; if (NextStateCode.ToUpper() == "ENDFLOW") { stateCode = NextStateCode; } else { stateCode = string.IsNullOrEmpty(NextStateCode) ? SMTWorkFlowManage.GetNextState(workflowRuntime, instance, entity.STATECODE) : NextStateCode; } if (stateCode == "EndFlow") { #region entity.FLOW_FLOWRECORDMASTER_T.CHECKSTATE = "2"; //设为终审通过 if (entity.EDITDATE == entity.AGENTEDITDATE) //代理审核时 { entity.FLOW_FLOWRECORDMASTER_T.EDITUSERID = entity.AGENTUSERID; entity.FLOW_FLOWRECORDMASTER_T.EDITUSERNAME = entity.AGENTERNAME; } else //正常审核时 { entity.FLOW_FLOWRECORDMASTER_T.EDITUSERID = entity.EDITUSERID; entity.FLOW_FLOWRECORDMASTER_T.EDITUSERNAME = entity.EDITUSERNAME; } entity.FLOW_FLOWRECORDMASTER_T.EDITDATE = DateTime.Now; UpdateFlowDetailRecord( entity, NextStateCode, AppUser.UserID); FLOW_FLOWRECORDMASTER_TDAL.Update(entity.FLOW_FLOWRECORDMASTER_T); tmpDataResult.AppState = stateCode; tmpDataResult.FlowResult = FlowResult.END; //如果没有下一处理节点,则返回END tmpDataResult.CheckState = "2"; #endregion } else { #region //添加下一状态 FLOW_FLOWRECORDDETAIL_T entity2 = new FLOW_FLOWRECORDDETAIL_T(); //添加下一状态 entity2.FLOWRECORDDETAILID = Guid.NewGuid().ToString(); if (NextStateCode != "") { entity2.STATECODE = NextStateCode; } else { entity2.STATECODE = stateCode; } entity2.FLOW_FLOWRECORDMASTER_T = entity.FLOW_FLOWRECORDMASTER_T; entity2.PARENTSTATEID = entity.FLOWRECORDDETAILID;// entity.StateCode; entity2.FLAG = "0"; entity2.CHECKSTATE = "2"; entity2.CREATEPOSTID = entity.CREATEPOSTID; entity2.CREATECOMPANYID = entity.CREATECOMPANYID; entity2.CREATEDEPARTMENTID = entity.CREATEDEPARTMENTID; entity2.CREATEUSERID = entity.EDITUSERID; entity2.CREATEUSERNAME = entity.EDITUSERNAME; entity2.EDITUSERID = AppUser.UserID; entity2.EDITUSERNAME = AppUser.UserName; entity2.EDITCOMPANYID = AppUser.CompanyID; entity2.EDITDEPARTMENTID = AppUser.DepartmentID; entity2.EDITPOSTID = AppUser.PostID; entity2.CREATEDATE = DateTime.Now; entity2.EDITDATE = DateTime.Now; if (AgentUser != null) //如果启用了代理,把代理人信息写入 { entity2.AGENTUSERID = AgentUser.UserID; entity2.AGENTERNAME = AgentUser.UserName; entity2.AGENTEDITDATE = DateTime.Now; } tmpDataResult.AppState = entity2.STATECODE; fUser.NextEditUserID = entity2.EDITUSERID; fUser.NextEditUserName = entity2.EDITUSERNAME; AddFlowDetailRecord( entity2, NextStateCode, AppUser.UserID); tmpDataResult.FlowResult = FlowResult.SUCCESS; tmpDataResult.CheckState = "1"; #endregion #region 更新审核主表的审核人(提莫科技新增) entity.FLOW_FLOWRECORDMASTER_T.CHECKSTATE = "1"; if (entity.EDITDATE == entity.AGENTEDITDATE) { entity.FLOW_FLOWRECORDMASTER_T.EDITUSERID = entity.AGENTUSERID; entity.FLOW_FLOWRECORDMASTER_T.EDITUSERNAME = entity.AGENTERNAME; } else //正常审核时 { entity.FLOW_FLOWRECORDMASTER_T.EDITUSERID = entity.EDITUSERID; entity.FLOW_FLOWRECORDMASTER_T.EDITUSERNAME = entity.EDITUSERNAME; } entity.FLOW_FLOWRECORDMASTER_T.EDITDATE = DateTime.Now; FLOW_FLOWRECORDMASTER_TDAL.Update(entity.FLOW_FLOWRECORDMASTER_T); #endregion } tmpDataResult.IsCountersignComplete = true; return tmpDataResult; //如有下一节点,返回SUCCESS #endregion } } catch (Exception ex) { Tracer.Debug("DoFlowRecord2异常信息 :" + ex.ToString()); throw new Exception("DoFlowRecord2:" + ex.InnerException + ex.Message); } }
public string GetFlowDefine( SubmitData ApprovalData) { try { FlowUser user = new FlowUser(ApprovalData.ApprovalUser.CompanyID, ApprovalData.ApprovalUser.UserID, ApprovalData.ModelCode); user.TrackingMessage += "构建引擎消息FlowBLL.GetFlowDefine.GetFlowByModelName(ApprovalData.ApprovalUser.DepartmentID=" + ApprovalData.ApprovalUser.DepartmentID + ";OrgType='" + ((int)ApprovalData.FlowType).ToString() + ")'"; List<FLOW_MODELFLOWRELATION_T> MODELFLOWRELATION = GetFlowByModelName( ApprovalData.ApprovalUser.CompanyID, ApprovalData.ApprovalUser.DepartmentID, ApprovalData.ModelCode, ((int)ApprovalData.FlowType).ToString(), ref user); if (MODELFLOWRELATION == null || MODELFLOWRELATION.Count == 0) { return null; } return MODELFLOWRELATION.First().FLOW_FLOWDEFINE_T.LAYOUT; } catch (Exception e) { Tracer.Debug("构建引擎消息出错;异常信息\r\n" + e.ToString()); throw e; } }
/// <summary> /// 将异常信息记录到流程监控表里 /// </summary> /// <param name="submitData">SubmitData</param> /// <param name="flowUser">FlowUser</param> public static void AddFlowMonitor(SubmitData submitData, FlowUser flowUser) { try { #region 提交信息 StringBuilder sb = new StringBuilder(); sb.AppendLine("submitData.FlowSelectType =FlowSelectType." + submitData.FlowSelectType + ";"); sb.AppendLine("submitData.FormID = \"" + submitData.FormID + "\";"); sb.AppendLine("submitData.ModelCode = \"" + submitData.ModelCode + "\";"); sb.AppendLine("submitData.ApprovalUser = new UserInfo();"); sb.AppendLine("submitData.ApprovalUser.CompanyID = \"" + submitData.ApprovalUser.CompanyID + "\";"); sb.AppendLine("submitData.ApprovalUser.DepartmentID = \"" + submitData.ApprovalUser.DepartmentID + "\";"); sb.AppendLine("submitData.ApprovalUser.PostID = \"" + submitData.ApprovalUser.PostID + "\";"); sb.AppendLine("submitData.ApprovalUser.UserID = \"" + submitData.ApprovalUser.UserID + "\";"); sb.AppendLine("submitData.ApprovalUser.UserName = \"" + submitData.ApprovalUser.UserName + "\";"); sb.AppendLine("submitData.NextStateCode = \"" + (submitData.NextStateCode != null ? submitData.NextStateCode : "空") + "\";"); sb.AppendLine("submitData.NextApprovalUser = new UserInfo();"); sb.AppendLine("submitData.NextApprovalUser.CompanyID = \"" + (submitData.NextApprovalUser != null ? submitData.NextApprovalUser.CompanyID : "空") + "\";"); sb.AppendLine("submitData.NextApprovalUser.DepartmentID = \"" + (submitData.NextApprovalUser != null ? submitData.NextApprovalUser.DepartmentID : "空") + "\";"); sb.AppendLine("submitData.NextApprovalUser.PostID = \"" + (submitData.NextApprovalUser != null ? submitData.NextApprovalUser.PostID : "空") + "\";"); sb.AppendLine("submitData.NextApprovalUser.UserID = \"" + (submitData.NextApprovalUser != null ? submitData.NextApprovalUser.UserID : "空") + "\";"); sb.AppendLine("submitData.NextApprovalUser.UserName = \"" + (submitData.NextApprovalUser != null ? submitData.NextApprovalUser.UserName : "******") + "\";"); sb.AppendLine("submitData.SubmitFlag = SubmitFlag." + submitData.SubmitFlag + ";"); // sb.AppendLine("submitData.XML = \"" + submitData.XML + "\";"); sb.AppendLine("submitData.FlowType = FlowType." + submitData.FlowType.ToString() + ";"); sb.AppendLine("submitData.ApprovalResult = ApprovalResult." + submitData.ApprovalResult.ToString() + ";"); sb.AppendLine("submitData.ApprovalContent = \"" + submitData.ApprovalContent + "\";"); #region 提交人信息 sb.AppendLine("submitData.SumbitCompanyID = \"" + submitData.SumbitCompanyID + "\";"); sb.AppendLine("submitData.SumbitDeparmentID = \"" + submitData.SumbitDeparmentID + "\";"); sb.AppendLine("submitData.SumbitPostID = \"" + submitData.SumbitPostID + "\";"); sb.AppendLine("submitData.SumbitUserID = \"" + submitData.SumbitUserID + "\";"); sb.AppendLine("submitData.SumbitUserName = \"" + submitData.SumbitUserName + "\";"); #endregion #endregion FLOW_EXCEPTIONLOG entity = new FLOW_EXCEPTIONLOG(); entity.ID = Guid.NewGuid().ToString().Replace("-", "");//主键ID entity.FORMID = submitData.FormID;//业务ID entity.MODELCODE = submitData.ModelCode;//模块代码 entity.CREATEDATE = DateTime.Now;//创建日期 entity.CREATENAME = submitData.SumbitUserID == null ? submitData.ApprovalUser.UserName : submitData.SumbitUserName;//创建人 entity.SUBMITINFO = sb.ToString();//提交信息 entity.LOGINFO = flowUser.ErrorMsg;//异常日志信息 entity.MODELNAME = flowUser.ModelName;//模块名称 entity.OWNERID = submitData.ApprovalUser.UserID;//单据所属人ID entity.OWNERNAME = submitData.ApprovalUser.UserName;//单据所属人姓名 entity.OWNERCOMPANYID = submitData.ApprovalUser.CompanyID;//单据所属人公司ID entity.OWNERCOMPANYNAME =(submitData.SumbitUserID == submitData.ApprovalUser.UserID)?flowUser.CompayName: submitData.ApprovalUser.CompanyName;//单据所属人公司名称 entity.OWNERDEPARMENTID = submitData.ApprovalUser.DepartmentID;//单据所属人部门ID entity.OWNERDEPARMENTNAME = (submitData.SumbitUserID == submitData.ApprovalUser.UserID) ? flowUser.DepartmentName : submitData.ApprovalUser.DepartmentName;//单据所属人部门名称 entity.OWNERPOSTID = submitData.ApprovalUser.PostID;//单据所属人岗位ID entity.OWNERPOSTNAME = (submitData.SumbitUserID == submitData.ApprovalUser.UserID) ? flowUser.PostName : submitData.ApprovalUser.PostName;//单据所属人岗位名称 entity.AUDITSTATE = submitData.ApprovalResult == ApprovalResult.Pass ? "审核通过" : "审核不通过";//审核状态;审核通过,审核不通过 FLOW_EXCEPTIONLOGDAL dal = new FLOW_EXCEPTIONLOGDAL(); dal.Add( entity); Tracer.Debug("Formid=" + submitData.FormID + ";将异常信息记录到流程监控表里,成功!"); } catch (Exception e) { Tracer.Debug("Formid=" + submitData.FormID + ";将异常信息记录到流程监控表里,出错:异常信息:" + e.ToString()); // throw e; } }
/// <summary> /// 将每一步的流程审核过程中的持久化实例保存下来 /// </summary> /// <param name="submitData">SubmitData</param> public static void AddInstance(SubmitData submitData,FlowUser fUser) { string instanceid = ""; try { //1查找工作流程实例ID;2查询工作流持久化对像;3保存持久化 FLOW_INSTANCE_STATEDAL dal = new FLOW_INSTANCE_STATEDAL(); FLOW_FLOWRECORDMASTER_T master = dal.GetFlowerMasterIDByFormid( submitData.FormID); if (master != null && !string.IsNullOrEmpty(master.INSTANCEID.Trim())) { FLOW_INSTANCE_STATE entity = new FLOW_INSTANCE_STATE(); FLOW_INSTANCE_STATE model = dal.GetInstanceModel(master.INSTANCEID); if (!string.IsNullOrEmpty(model.INSTANCE_ID)) { instanceid = model.INSTANCE_ID; entity.INSTANCE_ID = model.INSTANCE_ID;// entity.STATE = model.STATE;// entity.STATUS = model.STATUS;// entity.UNLOCKED = model.UNLOCKED;// entity.BLOCKED = model.BLOCKED;// entity.INFO = model.INFO;// entity.MODIFIED = model.MODIFIED;// entity.OWNER_ID = model.OWNER_ID;// entity.OWNED_UNTIL = model.OWNED_UNTIL;// entity.NEXT_TIMER = model.NEXT_TIMER;// entity.CREATEID = submitData.ApprovalUser.UserID;//创建人ID entity.CREATENAME = submitData.ApprovalUser.UserName;//创建人姓名 entity.EDITID = fUser.NextEditUserID;//下一个审核人ID entity.EDITNAME = fUser.NextEditUserName;//下一个审核人姓名 entity.FORMID = master.FORMID; FLOW_INSTANCE_STATEDAL inDal = new FLOW_INSTANCE_STATEDAL(); inDal.Add(entity); Tracer.Debug("Formid=" + submitData.FormID + "; instanceid=" + instanceid + " 将每一步的流程审核过程中的持久化实例保存下来,成功!"); } else { Tracer.Debug("Formid=" + submitData.FormID + "; 没法找到持久化数据库的instanceid,可能丢失 instanceid=" + master.INSTANCEID + " "); } } } catch (Exception e) { Tracer.Debug("Formid=" + submitData.FormID + "; instanceid=" + instanceid + " 将每一步的流程审核过程中的持久化实例保存下来出错:异常信息:" + e.ToString()); //throw new Exception(e.Message, e); } }
/// <summary> /// 将异常信息记录到流程监控表里 /// </summary> /// <param name="submitData">SubmitData</param> /// <param name="flowUser">FlowUser</param> public static void AddFlowMonitor(SubmitData submitData, FlowUser flowUser) { try { #region 提交信息 StringBuilder sb = new StringBuilder(); sb.AppendLine("submitData.FlowSelectType =FlowSelectType." + submitData.FlowSelectType + ";"); sb.AppendLine("submitData.FormID = \"" + submitData.FormID + "\";"); sb.AppendLine("submitData.ModelCode = \"" + submitData.ModelCode + "\";"); sb.AppendLine("submitData.ApprovalUser = new UserInfo();"); sb.AppendLine("submitData.ApprovalUser.CompanyID = \"" + submitData.ApprovalUser.CompanyID + "\";"); sb.AppendLine("submitData.ApprovalUser.DepartmentID = \"" + submitData.ApprovalUser.DepartmentID + "\";"); sb.AppendLine("submitData.ApprovalUser.PostID = \"" + submitData.ApprovalUser.PostID + "\";"); sb.AppendLine("submitData.ApprovalUser.UserID = \"" + submitData.ApprovalUser.UserID + "\";"); sb.AppendLine("submitData.ApprovalUser.UserName = \"" + submitData.ApprovalUser.UserName + "\";"); sb.AppendLine("submitData.NextStateCode = \"" + (submitData.NextStateCode != null ? submitData.NextStateCode : "空") + "\";"); sb.AppendLine("submitData.NextApprovalUser = new UserInfo();"); sb.AppendLine("submitData.NextApprovalUser.CompanyID = \"" + (submitData.NextApprovalUser != null ? submitData.NextApprovalUser.CompanyID : "空") + "\";"); sb.AppendLine("submitData.NextApprovalUser.DepartmentID = \"" + (submitData.NextApprovalUser != null ? submitData.NextApprovalUser.DepartmentID : "空") + "\";"); sb.AppendLine("submitData.NextApprovalUser.PostID = \"" + (submitData.NextApprovalUser != null ? submitData.NextApprovalUser.PostID : "空") + "\";"); sb.AppendLine("submitData.NextApprovalUser.UserID = \"" + (submitData.NextApprovalUser != null ? submitData.NextApprovalUser.UserID : "空") + "\";"); sb.AppendLine("submitData.NextApprovalUser.UserName = \"" + (submitData.NextApprovalUser != null ? submitData.NextApprovalUser.UserName : "******") + "\";"); sb.AppendLine("submitData.SubmitFlag = SubmitFlag." + submitData.SubmitFlag + ";"); // sb.AppendLine("submitData.XML = \"" + submitData.XML + "\";"); sb.AppendLine("submitData.FlowType = FlowType." + submitData.FlowType.ToString() + ";"); sb.AppendLine("submitData.ApprovalResult = ApprovalResult." + submitData.ApprovalResult.ToString() + ";"); sb.AppendLine("submitData.ApprovalContent = \"" + submitData.ApprovalContent + "\";"); #region 提交人信息 sb.AppendLine("submitData.SumbitCompanyID = \"" + submitData.SumbitCompanyID + "\";"); sb.AppendLine("submitData.SumbitDeparmentID = \"" + submitData.SumbitDeparmentID + "\";"); sb.AppendLine("submitData.SumbitPostID = \"" + submitData.SumbitPostID + "\";"); sb.AppendLine("submitData.SumbitUserID = \"" + submitData.SumbitUserID + "\";"); sb.AppendLine("submitData.SumbitUserName = \"" + submitData.SumbitUserName + "\";"); #endregion #endregion FLOW_EXCEPTIONLOG entity = new FLOW_EXCEPTIONLOG(); entity.ID = Guid.NewGuid().ToString().Replace("-", ""); //主键ID entity.FORMID = submitData.FormID; //业务ID entity.MODELCODE = submitData.ModelCode; //模块代码 entity.CREATEDATE = DateTime.Now; //创建日期 entity.CREATENAME = submitData.SumbitUserID == null ? submitData.ApprovalUser.UserName : submitData.SumbitUserName; //创建人 entity.SUBMITINFO = sb.ToString(); //提交信息 entity.LOGINFO = flowUser.ErrorMsg; //异常日志信息 entity.MODELNAME = flowUser.ModelName; //模块名称 entity.OWNERID = submitData.ApprovalUser.UserID; //单据所属人ID entity.OWNERNAME = submitData.ApprovalUser.UserName; //单据所属人姓名 entity.OWNERCOMPANYID = submitData.ApprovalUser.CompanyID; //单据所属人公司ID entity.OWNERCOMPANYNAME = (submitData.SumbitUserID == submitData.ApprovalUser.UserID)?flowUser.CompayName: submitData.ApprovalUser.CompanyName; //单据所属人公司名称 entity.OWNERDEPARMENTID = submitData.ApprovalUser.DepartmentID; //单据所属人部门ID entity.OWNERDEPARMENTNAME = (submitData.SumbitUserID == submitData.ApprovalUser.UserID) ? flowUser.DepartmentName : submitData.ApprovalUser.DepartmentName; //单据所属人部门名称 entity.OWNERPOSTID = submitData.ApprovalUser.PostID; //单据所属人岗位ID entity.OWNERPOSTNAME = (submitData.SumbitUserID == submitData.ApprovalUser.UserID) ? flowUser.PostName : submitData.ApprovalUser.PostName; //单据所属人岗位名称 entity.AUDITSTATE = submitData.ApprovalResult == ApprovalResult.Pass ? "审核通过" : "审核不通过"; //审核状态;审核通过,审核不通过 FLOW_EXCEPTIONLOGDAL dal = new FLOW_EXCEPTIONLOGDAL(); dal.Add(dal.GetOracleConnection(), entity); LogHelper.WriteLog("Formid=" + submitData.FormID + ";将异常信息记录到流程监控表里,成功!"); } catch (Exception e) { LogHelper.WriteLog("Formid=" + submitData.FormID + ";将异常信息记录到流程监控表里,出错:异常信息:" + e.ToString()); // throw e; } }
/// <summary> /// 自选流程(对数据库操作、对服务操作) /// </summary> /// <param name="ApprovalData"></param> /// <param name="APPDataResult"></param> /// <param name="fd"></param> /// <returns></returns> public DataResult ApprovalFreeFlow(SubmitData ApprovalData, DataResult APPDataResult, List<FLOW_FLOWRECORDDETAIL_T> fd, ref FlowUser user) { // WorkflowRuntime workflowRuntime = null; WorkflowInstance instance = null; FLOW_FLOWRECORDDETAIL_T entity = new FLOW_FLOWRECORDDETAIL_T(); entity.FLOW_FLOWRECORDMASTER_T = new FLOW_FLOWRECORDMASTER_T(); UserInfo AppUser = new UserInfo(); //下一审核人 UserInfo AgentAppUser = new UserInfo(); //代理下一审核人 try { APPDataResult.RunTime += "---GetAppInfoStart:" + DateTime.Now.ToString(); List<FLOW_FLOWRECORDDETAIL_T> tmp = fd.Where(c => (c.EDITUSERID == ApprovalData.ApprovalUser.UserID || c.AGENTUSERID == ApprovalData.ApprovalUser.UserID) && c.FLAG == "0").ToList(); APPDataResult.RunTime += "---GetAppInfoEnd:" + DateTime.Now.ToString(); if (tmp == null) { APPDataResult.FlowResult = FlowResult.FAIL; APPDataResult.Err = "没有找到待审核信息"; user.TrackingMessage += "没有找到待审核信息\r\n"; // DataResult.UserInfo = null; return APPDataResult; } entity = tmp[0]; entity.EDITDATE = DateTime.Now; //审批时间 if (entity.AGENTUSERID == ApprovalData.ApprovalUser.UserID) { entity.AGENTEDITDATE = entity.EDITDATE; //代理审批时审批时间与代理审批时间到致 } //entity.EditUserID = AppUserId; entity.CONTENT = ApprovalData.ApprovalContent; entity.CHECKSTATE = ((int)ApprovalData.ApprovalResult).ToString(); try { workflowRuntime = SMTWorkFlowManage.CreateWorkFlowRuntime(true); Tracer.Debug("Formid=" + ApprovalData.FormID + ";开始 审核获取[自选流程]工作流实例ID=" + tmp[0].FLOW_FLOWRECORDMASTER_T.INSTANCEID); instance = SMTWorkFlowManage.GetWorkflowInstance(workflowRuntime, tmp[0].FLOW_FLOWRECORDMASTER_T.INSTANCEID);// workflowRuntime.GetWorkflow(new Guid(tmp[0].FLOW_FLOWRECORDMASTER_T.INSTANCEID)); Tracer.Debug("Formid=" + ApprovalData.FormID + ";完成 审核获取[自选流程]工作流实例ID=" + instance.InstanceId.ToString()); } catch { Tracer.Debug("Formid=" + ApprovalData.FormID + ";完成 审核获取[自选流程]工作流实例 出错,需要重新构造工作流程实例,原来的实例ID=" + tmp[0].FLOW_FLOWRECORDMASTER_T.INSTANCEID); workflowRuntime = SMTWorkFlowManage.CreateWorkFlowRuntime(true); instance = SMTWorkFlowManage.CreateFreeWorkflowInstance(workflowRuntime, "FreeFlow.xml");//自选流程使用 tmp[0].FLOW_FLOWRECORDMASTER_T.INSTANCEID = instance.InstanceId.ToString(); Tracer.Debug("Formid=" + ApprovalData.FormID + ";完成 重新构造[自选流程]工作流程实例,新的实例ID=" + tmp[0].FLOW_FLOWRECORDMASTER_T.INSTANCEID); } //不同意状态处理 if (ApprovalData.ApprovalResult == ApprovalResult.NoPass) { instance.Terminate("0"); user.TrackingMessage += "终审不通过,中止流程 FORMID=" + user.FormID; entity.FLOW_FLOWRECORDMASTER_T.CHECKSTATE = "3"; //设为终审不通过 entity.FLOW_FLOWRECORDMASTER_T.EDITUSERID = ApprovalData.ApprovalUser.UserID; entity.FLOW_FLOWRECORDMASTER_T.EDITUSERNAME = ApprovalData.ApprovalUser.UserName; entity.FLOW_FLOWRECORDMASTER_T.EDITDATE = DateTime.Now; UpdateFlowDetailRecord(entity, ApprovalData.NextStateCode, ApprovalData.NextApprovalUser.UserID); FLOW_FLOWRECORDMASTER_TDAL.Update(entity.FLOW_FLOWRECORDMASTER_T);//对数据库操作 APPDataResult.CheckState = "3";// user.TrackingMessage += "终审不通过,设置状态 CheckState=3;FORMID=" + user.FormID; APPDataResult.FlowResult = FlowResult.END; // DataResult.UserInfo = null; // return DataResult; } else { //下一审核人赋值 if (ApprovalData.NextApprovalUser != null && !string.IsNullOrEmpty(ApprovalData.NextApprovalUser.UserID)) { AppUser = ApprovalData.NextApprovalUser; } else { AppUser = ApprovalData.ApprovalUser;//如果没有下一审核人,下一审核人就是当前的审核人 } user.TrackingMessage += "选择了下一个审核人 AppUser="******";FORMID=" + user.FormID; AgentAppUser = GetAgentUserInfo(ApprovalData.ModelCode, AppUser.UserID); //查询是否启用了代理人(对服务操作) user.TrackingMessage += "查询是否启用了代理人 AppUser="******";FORMID=" + user.FormID; FlowDataType.FlowData FlowData = new FlowDataType.FlowData(); FlowData.xml = ApprovalData.XML; //workflowRuntime.WorkflowCompleted += delegate(object sender, WorkflowCompletedEventArgs e) //{//完成工作流实例 // instance = null; //}; ApprovalData.NextStateCode = ApprovalData.NextStateCode == "EndFlow" ? "EndFlow" : "Approval"; APPDataResult.RunTime += "---DoFlowStart:" + DateTime.Now.ToString(); APPDataResult = DoFlowRecord(workflowRuntime, instance, entity, ApprovalData.NextStateCode, AppUser, AgentAppUser, ApprovalData.SubmitFlag, ApprovalData.FlowType, ref user); //处理流程数据 APPDataResult.AgentUserInfo = AgentAppUser; APPDataResult.RunTime += "---DoFlowEnd:" + DateTime.Now.ToString(); if (ApprovalData.NextStateCode == "EndFlow") { //ManualWorkflowSchedulerService scheduleService = workflowRuntime.GetService(typeof(ManualWorkflowSchedulerService)) as ManualWorkflowSchedulerService; //scheduleService.RunWorkflow(instance.InstanceId); //workflowRuntime.GetService<FlowEvent>().OnDoFlow(instance.InstanceId, FlowData); //激发流程引擎执行到一下流程 //scheduleService.RunWorkflow(instance.InstanceId); //System.Threading.Thread.Sleep(1000); } } return APPDataResult; } catch (Exception e) { Tracer.Debug("自选流程提交出错:FORMID=" + user.FormID + "\r\n 异常信息:" + e.ToString()); throw new Exception("自选流程提交出错,请联系管理员! \r\n FormID=" + user.FormID + ""); } finally { AppUser = null; AgentAppUser = null; entity = null; instance = null; SMTWorkFlowManage.ColseWorkFlowRuntime(workflowRuntime); } }
/// <summary> /// 获取下一状态数据 /// </summary> /// <param name="companyID"></param> /// <param name="FlowDefineXML"></param> /// <param name="Rules"></param> /// <param name="FlowLayoutXML"></param> /// <param name="BusinessXml"></param> /// <param name="UserID"></param> /// <param name="PostID"></param> /// <param name="FlowType"></param> /// <param name="DataResult"></param> /// <param name="user"></param> public void TmFlowToNextStep(string companyID, string FlowDefineXML, string Rules, string FlowLayoutXML, string BusinessXml, string UserID, string PostID, FlowType FlowType, ref DataResult DataResult, ref FlowUser user) { WorkflowRuntime WfRuntime = null; WorkflowInstance Instance = null; string strCurrActivitID = "StartFlow"; string strNextActivitID = "StartFlow"; bool IsCountersign = false; string CountersignType = "0"; //Role_UserType RuleName; List<UserInfo> AppUserInfo = null; Dictionary<FlowRole, List<UserInfo>> DictCounterUser = null; try { user.TrackingMessage += "创建工作流运行时 SMTWorkFlowManage.CreateWorkFlowRuntime(false)开始\r\n"; //创建工作流 WfRuntime = SMTWorkFlowManage.CreateWorkFlowRuntime(false); user.TrackingMessage += "创建工作流运行时SMTWorkFlowManage.CreateWorkFlowRuntime(false)完成\r\n"; Instance = SMTWorkFlowManage.CreateWorkflowInstance(WfRuntime, FlowDefineXML, Rules); #region 激发事件到一下状态 strCurrActivitID = strNextActivitID; //user.TrackingMessage += "激发事件到一下状态,并获取状态代码 SMTWorkFlowManage.GetNextStateByEvent(WfRuntime, Instance, strNextState, xml)开始" + Instance.InstanceId.ToString() + "\r\n"; strNextActivitID = SMTWorkFlowManage.GetFlowNextStepRoles(WfRuntime, Instance, strNextActivitID, BusinessXml); //user.TrackingMessage += "激发事件到一下状态,并获取状态代码 SMTWorkFlowManage.GetNextStateByEvent(WfRuntime, Instance, strNextState, xml)完成" + Instance.InstanceId.ToString() + "\r\n"; if (strNextActivitID == "EndFlow") { strNextActivitID = strCurrActivitID; } else { //获取节点对应的角色id List<FlowRole> listRoleID = FlowUtility.GetRlueIdFromActivitID(FlowLayoutXML, strNextActivitID, ref IsCountersign, ref CountersignType); if (listRoleID.Count == 0) { DataResult.Err = "流程:" + user.FlowName + " 没有找到对应角色"; DataResult.FlowResult = FlowResult.FAIL; Tracer.Debug("Formid=" + user.FormID + ";活动属性 Name=" + strNextActivitID + ";没有在流程:" + user.FlowName + " Layout中找到对应角色,Layout如下:\r\r" + FlowLayoutXML); return; } if (!IsCountersign) { Tracer.Debug("Formid=" + user.FormID + ";(非会签) 根活动的字符串查找角色状态码(即活动Name属性)StateCode=" + strNextActivitID + " Layout=" + FlowLayoutXML + ""); #region 非会签 bool isHigher = false; //根据角色找人,如果角色有多个人,只找其中一个 AppUserInfo = TmGetUserByRoleId(listRoleID[0].RoleName, UserID, PostID, ref isHigher); #region 打印审核人 string names = "\r\n=======FormID=" + user.FormID + " 非会签 根据角色找人,如果角色有多个人,只找其中一个 打印审核人B(listRole[0].RoleName=" + listRoleID[0].RoleName + ";UserID=" + UserID + ";PostID=" + PostID + ";isHigher=" + isHigher.ToString() + ")=======\r\n"; foreach (var us in AppUserInfo) { names += "CompanyID:" + us.CompanyID + "\r\n"; names += "DepartmentID:" + us.DepartmentID + "\r\n"; names += "PostID:" + us.PostID + "\r\n"; names += "UserID:" + us.UserID + "\r\n"; names += "CompanyName:" + us.CompanyName + "\r\n"; names += "DepartmentName:" + us.DepartmentName + "\r\n"; names += "PostName:" + us.PostName + "\r\n"; names += "UserName:"******"\r\n"; names += "----------------------------------------------------\r\n"; } if (!isHigher && listRoleID[0].IsOtherCompany != null) { if (listRoleID[0].IsOtherCompany.Value == true) { names += "是否指定公司:" + listRoleID[0].IsOtherCompany.Value.ToString() + "\r\n"; names += "公司的ID:" + listRoleID[0].OtherCompanyID + "\r\n"; if (string.IsNullOrEmpty(listRoleID[0].OtherCompanyID)) { names += "Layout=" + FlowLayoutXML + "\r\n"; } } else if (listRoleID[0].IsOtherCompany.Value == false) { names += "实际要查找公司的ID:" + companyID + " " + user.GetCompanyName(companyID) + "\r\n"; } } user.ErrorMsg += names; Tracer.Debug(names); #endregion #region beyond if (!isHigher) { if (listRoleID[0].IsOtherCompany != null && listRoleID[0].IsOtherCompany.Value == true) {//指定公司 //过滤人 AppUserInfo = AppUserInfo.Where(u => u.CompanyID == listRoleID[0].OtherCompanyID).ToList(); } else { AppUserInfo = AppUserInfo.Where(u => u.CompanyID == companyID).ToList(); } } #endregion if (AppUserInfo == null || AppUserInfo.Count == 0) { DataResult.Err = user.GetCompanyName(companyID) + " " + listRoleID[0].Remark + " 没有找到审核人"; DataResult.FlowResult = FlowResult.FAIL; return; } if (AppUserInfo.Where(c => c.UserID == UserID).Count() == 0) { } #endregion } else { Tracer.Debug("Formid=" + user.FormID + ";(会签) 根活动的字符串查找角色状态码(即活动Name属性)StateCode=" + strNextActivitID + " Layout=" + FlowLayoutXML + ""); #region 会签 DictCounterUser = new Dictionary<FlowRole, List<UserInfo>>(); if (CountersignType == "0") { #region 全部审核通过才算通过 for (int i = 0; i < listRoleID.Count; i++) { bool isHigher = false; var listuserinfo = TmGetUserByRoleId(listRoleID[i].RoleName, UserID, PostID, ref isHigher); #region 打印审核人 string names = "\r\n=======FormID=" + user.FormID + "会签 全部审核通过才算通过 打印审核人C(listRole[0].RoleName=" + listRoleID[i].RoleName + ";UserID=" + UserID + ";PostID=" + PostID + ";isHigher=" + isHigher.ToString() + ")=======\r\n"; if (listuserinfo != null) { foreach (var u in listuserinfo) { names += "CompanyID:" + u.CompanyID + "\r\n"; names += "DepartmentID:" + u.DepartmentID + "\r\n"; names += "PostID:" + u.PostID + "\r\n"; names += "UserID:" + u.UserID + "\r\n"; names += "CompanyName:" + u.CompanyName + "\r\n"; names += "DepartmentName:" + u.DepartmentName + "\r\n"; names += "PostName:" + u.PostName + "\r\n"; names += "UserName:"******"\r\n"; names += "----------------------------------------------------\r\n"; } } if (!isHigher && listRoleID[i].IsOtherCompany != null) { if (listRoleID[i].IsOtherCompany.Value == true) { names += "是否指定公司:" + listRoleID[i].IsOtherCompany.Value.ToString() + "\r\n"; names += "公司的ID:" + listRoleID[i].OtherCompanyID + "\r\n"; if (string.IsNullOrEmpty(listRoleID[i].OtherCompanyID)) { names += "Layout=" + FlowLayoutXML + "\r\n"; } } else if (listRoleID[i].IsOtherCompany.Value == false) { names += "实际要查找公司的ID:" + companyID + "\r\n"; } } user.ErrorMsg += names; Tracer.Debug(names); #endregion if (!isHigher) { if (listRoleID[i].IsOtherCompany != null && listRoleID[i].IsOtherCompany.Value == true) { listuserinfo = listuserinfo.Where(u => u.CompanyID == listRoleID[i].OtherCompanyID).ToList(); } else { listuserinfo = listuserinfo.Where(u => u.CompanyID == companyID).ToList(); } } if (listuserinfo == null || listuserinfo.Count == 0) { DataResult.Err = user.GetCompanyName(companyID) + " " + listRoleID[i].Remark + " 没有找到审核人"; DataResult.FlowResult = FlowResult.FAIL; return; } DictCounterUser.Add(listRoleID[i], listuserinfo); } #endregion } else { #region 只有一个审核通过了就算审核通过了 bool bFlag = false;//判断是否找到审核人 string roles = "";//得到所有的角色 user.TrackingMessage += "GetUserByStateCode\r\n"; for (int i = 0; i < listRoleID.Count; i++) { roles += listRoleID[i].Remark + "、"; #region bool isHigher = false; var listuserinfo = TmGetUserByRoleId(listRoleID[i].RoleName, UserID, PostID, ref isHigher); #region 打印审核人 string names = "\r\n=======FormID=" + user.FormID + " 会签 只有一个审核通过了就算审核通过了 打印审核人C(listRole[0].RoleName=" + listRoleID[i].RoleName + ";UserID=" + UserID + ";PostID=" + PostID + ";isHigher=" + isHigher.ToString() + ")=======\r\n"; foreach (var u in listuserinfo) { names += "CompanyID:" + u.CompanyID + "\r\n"; names += "DepartmentID:" + u.DepartmentID + "\r\n"; names += "PostID:" + u.PostID + "\r\n"; names += "UserID:" + u.UserID + "\r\n"; names += "CompanyName:" + u.CompanyName + "\r\n"; names += "DepartmentName:" + u.DepartmentName + "\r\n"; names += "PostName:" + u.PostName + "\r\n"; names += "UserName:"******"\r\n"; names += "----------------------------------------------------\r\n"; } if (!isHigher && listRoleID[i].IsOtherCompany != null) { if (listRoleID[i].IsOtherCompany.Value == true) { names += "是否指定公司:" + listRoleID[i].IsOtherCompany.Value.ToString() + "\r\n"; names += "公司的ID:" + listRoleID[i].OtherCompanyID + "\r\n"; if (string.IsNullOrEmpty(listRoleID[i].OtherCompanyID)) { names += "Layout=" + FlowLayoutXML + "\r\n"; } } else if (listRoleID[i].IsOtherCompany.Value == false) { names += "实际要查找公司的ID:" + companyID + "\r\n"; } } user.ErrorMsg += names; Tracer.Debug(names); #endregion if (!isHigher) { if (listRoleID[i].IsOtherCompany != null && listRoleID[i].IsOtherCompany.Value == true) { listuserinfo = listuserinfo.Where(u => u.CompanyID == listRoleID[i].OtherCompanyID).ToList(); } else { listuserinfo = listuserinfo.Where(u => u.CompanyID == companyID).ToList(); } } if (listuserinfo != null && listuserinfo.Count > 0) { bFlag = true; if (listuserinfo.FirstOrDefault(u => u.UserID == UserID) != null) { break; } } DictCounterUser.Add(listRoleID[i], listuserinfo); #endregion } if (!bFlag) { DataResult.Err = user.GetCompanyName(companyID) + " " + roles + " 没有找到审核人"; DataResult.FlowResult = FlowResult.FAIL; return; } user.TrackingMessage += " GetUserByStateCode完成\r\n"; //iscurruser = false; #endregion } #endregion } } #endregion DataResult.IsCountersign = IsCountersign; DataResult.AppState = strNextActivitID; DataResult.CountersignType = CountersignType; if (!IsCountersign) { #region 检查非会签角色是否有多个审核人 Tracer.Debug("FormID=" + user.FormID + " 检查非会签角色的审核人数=" + AppUserInfo.Count.ToString()); if (AppUserInfo.Count > 1) //处理角色对应多个用户,返回用户集给提交人,选择一个处理人 { DataResult.FlowResult = FlowResult.MULTIUSER; } DataResult.UserInfo = AppUserInfo; #endregion } else { Tracer.Debug("FormID=" + user.FormID + " 检查会签角色的审核人数=" + DictCounterUser.Count.ToString()); #region 检查会签角色是否有多个审核人,如果有多个审核人,则返回 DataResult.DictCounterUser = DictCounterUser; List<FlowRole> listkeys = DictCounterUser.Keys.ToList(); for (int i = 0; i < listkeys.Count; i++) { FlowRole key = listkeys[i]; if (DictCounterUser[key].Count > 1) { DataResult.FlowResult = FlowResult.Countersign; break; } } #endregion } user.TrackingMessage += " iscurruser完成\r\n"; } catch (Exception ex) { Tracer.Debug("Formid=" + user.FormID + ";GetUserByFlow2异常信息 :" + ex.ToString()); throw new Exception("获取下一状态数据出错,请联系管理员! \r\n FormID=" + user.FormID + ""); } finally { strCurrActivitID = null; strNextActivitID = null; //RuleName = null; AppUserInfo = null; Instance = null; user.TrackingMessage += " SMTWorkFlowManage.ColseWorkFlowRuntime(WfRuntime)\r\n"; SMTWorkFlowManage.ColseWorkFlowRuntime(WfRuntime); user.TrackingMessage += " SMTWorkFlowManage.ColseWorkFlowRuntime(WfRuntime)完成\r\n"; } }
/// <summary> /// 调用WCF 自动发起流程 /// </summary> /// <param name="dr"></param> /// <param name="sourceTable"></param> /// <param name="strAppMsg"></param> private void CallWCFService( DataRow dr, DataTable sourceTable, ref FlowUser sUser,ref string strAppMsg, ref string ErroMessage) { try { string tableName =dr["MODELCODE"]!=null? dr["MODELCODE"].ToString():""; string Binding = dr["WCFBINDINGCONTRACT"].ToString(); string WCFUrl = dr["WCFURL"].ToString(); WCFUrl = Config.GetSystemCode(dr["SYSTEMCODE"].ToString()) + WCFUrl; string FuncName = dr["FUNCTIONNAME"].ToString(); string FuncPameter = dr["FUNCTIONPARAMTER"].ToString(); string SplitChar = dr["PAMETERSPLITCHAR"].ToString(); string strDeptID = dr["OWNERDEPARTMENTID"].ToString(); string strCorpID = dr["OWNERCOMPANYID"].ToString(); string strPostID = dr["OWNERPOSTID"].ToString(); string strOwnerID = dr["RECEIVEUSER"].ToString(); FuncPameter = ReplaceValue(FuncPameter, sourceTable); string XmlTemplete = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>" + "\r\n" + "<Paras>" + "\r\n" + "<Para TableName=\"" + tableName + "\" Name=\"OWNERID\" Description=\"strOwnerID\" Value=\"" + strOwnerID + "\"></Para>" + "<Para TableName=\"" + tableName + "\" Name=\"OWNERDEPARTMENTID\" Description=\"OWNERDEPARTMENTID\" Value=\"" + strDeptID + "\"></Para>" + "<Para TableName=\"" + tableName + "\" Name=\"OWNERPOSTID\" Description=\"strOwnerID\" Value=\"" + strPostID + "\"></Para>" + "<Para TableName=\"" + tableName + "\" Name=\"OWNERCOMPANYID\" Description=\"strOwnerID\" Value=\"" + strCorpID + "\"></Para>" + "{0}" + "</Paras>"; FuncPameter = string.Format(XmlTemplete, FuncPameter); if (!string.IsNullOrEmpty(Binding) && !string.IsNullOrEmpty(WCFUrl) && !string.IsNullOrEmpty(FuncName)) { //GlobalFunction.CustomizeSplitChar = CustomsizeSplitChar; object TmpreceiveString = SMT.Workflow.Engine.BLL.Utility.CallWCFService(Binding, WCFUrl, FuncName, FuncPameter, ref ErroMessage); strAppMsg = TmpreceiveString == null ? "" : TmpreceiveString.ToString(); string cMessage = "执行链接:" + WCFUrl + "\r\n" + "执行方法:" + FuncName + "\r\n" + "绑定契约:" + Binding + "\r\n" + "执行结果:" + strAppMsg + "\r\n" + "执行参数:" + FuncPameter + "\r\n" + "----------------------------------------------------------"; Tracer.Debug("引擎调用WCF记录(自动发起流程) 成功 FORMID=" + sUser.FormID + "" + cMessage); } else { string cMessage = "执行链接:" + WCFUrl + "\r\n" + "执行方法:" + FuncName + "\r\n" + "绑定契约:" + Binding + "\r\n" + "执行结果:" + strAppMsg + "\r\n" + "执行参数:" + FuncPameter + "\r\n" + "----------------------------------------------------------\r\n"; sUser.ErrorMsg += "引擎调用WCF记录(自动发起流程)失败 FORMID=" + sUser.FormID + " 异常信息:" + ErroMessage + "\r\n"; ErroMessage = "FORMID=" + sUser.FormID + " 命名空间:SMT.FlowWFService类方法:CallWCFService() 调用WCF参数不全 \r\n" + cMessage; Tracer.Debug("引擎调用WCF记录(自动发起流程)失败 暂时不抛出异常,只记录日志,异常信息:" + ErroMessage); //throw new Exception("命名空间:SMT.FlowWFService类方法:CallWCFService() 调用WCF参数不全 WCF协议:" + Binding + "WCF地址:" + WCFUrl + "WCF方法:" + FuncName + "");//暂时不抛出异常,只记录日志 } } catch (Exception e) { sUser.ErrorMsg += "调用WCF 自动发起流程 FORMID=" + sUser.FormID + " 异常信息:" + e.Message + "\r\n"; throw new Exception("FORMID=" + sUser.FormID + " 命名空间:SMT.FlowWFService类方法:CallWCFService()" + e.Message); } }
public DataResult SubimtFlow(SubmitData submitData) { #region 测试用例 //submitData.FlowSelectType = FlowSelectType.FixedFlow; //submitData.FormID = "0671c1d0-07b9-4baa-9a36-349f0c09bd04"; //submitData.ModelCode = "T_WP_YEARNORMDRAFT"; //submitData.ApprovalUser = new UserInfo(); //submitData.ApprovalUser.CompanyID = "721c99d5-4cfb-4cc7-ba43-a05217e25918"; //submitData.ApprovalUser.DepartmentID = "7fc6b3af-92ec-442b-921e-6a8d13039ce9"; //submitData.ApprovalUser.PostID = "aa1496a5-840b-4b15-bc3e-36c2aeb14d3b"; //submitData.ApprovalUser.UserID = "e65cdb8f-26f2-440c-a5f9-977ea29fe4c2"; //submitData.ApprovalUser.UserName = "******"; //submitData.NextStateCode = ""; //submitData.NextApprovalUser = new UserInfo(); //submitData.NextApprovalUser.CompanyID = "721c99d5-4cfb-4cc7-ba43-a05217e25918"; //submitData.NextApprovalUser.DepartmentID = "e6e9546c-2d58-4f1c-abb6-139df4055114"; //submitData.NextApprovalUser.PostID = "fdbe688e-8886-42ac-9392-914e4e20960b"; //submitData.NextApprovalUser.UserID = "7e2fb3cd-ff1a-47b4-91b0-1572e6a3f3e5"; //submitData.NextApprovalUser.UserName = "******"; //submitData.SubmitFlag = SubmitFlag.Approval; //submitData.FlowType = FlowType.Approval; //submitData.ApprovalResult = ApprovalResult.Pass; //submitData.ApprovalContent = "审核通过"; //submitData.SumbitCompanyID = ""; //submitData.SumbitDeparmentID = ""; //submitData.SumbitPostID = ""; //submitData.SumbitUserID = ""; //submitData.SumbitUserName = ""; //StringBuilder sb = new StringBuilder(); //sb.AppendLine("<?xml version=\"1.0\" encoding=\"utf-8\"?>"); //sb.AppendLine("<System>"); //sb.AppendLine(" <Name>WP</Name>"); //sb.AppendLine(" <Version>1.0</Version>"); //sb.AppendLine(" <System>"); //sb.AppendLine(" <Function Description=\"\" Address=\"\" FuncName=\"\" Binding=\"\" SplitChar=\"Г\">"); //sb.AppendLine(" <ParaStr>"); //sb.AppendLine(" <Para TableName=\"\" Name=\"\" Description=\"\" Value=\"\" />"); //sb.AppendLine(" </ParaStr>"); //sb.AppendLine(" </Function>"); //sb.AppendLine(" </System>"); //sb.AppendLine(" <MsgOpen>"); //sb.AppendLine(" <AssemblyName>SMT.WP.UI</AssemblyName>"); //sb.AppendLine(" <PublicClass>SMT.WP.UI.Class.Utility</PublicClass>"); //sb.AppendLine(" <ProcessName>CreateFormFromEngine</ProcessName>"); //sb.AppendLine(" <PageParameter>WP/YearNormDraft/Audit</PageParameter>"); //sb.AppendLine(" <ApplicationOrder>{DNORMID}</ApplicationOrder>"); //sb.AppendLine(" <FormTypes>Audit</FormTypes>"); //sb.AppendLine(" </MsgOpen>"); //sb.AppendLine(" <Object Name=\"T_WP_YEARNORMDRAFT\" Description=\"公司年度经营指标方案\" Key=\"DNORMID\" id=\"0671c1d0-07b9-4baa-9a36-349f0c09bd04\">"); //sb.AppendLine(" <Attribute Name=\"DNORMID\" LableResourceID=\"DNORMID\" Description=\"指标主键ID,GUID\" DataType=\"string\" DataValue=\"0671c1d0-07b9-4baa-9a36-349f0c09bd04\" DataText=\"0671c1d0-07b9-4baa-9a36-349f0c09bd04\" />"); //sb.AppendLine(" <Attribute Name=\"PLANYEAR\" LableResourceID=\"PLANYEAR\" Description=\"计划年度\" DataType=\"string\" DataValue=\"2009\" DataText=\"2009\" />"); //sb.AppendLine(" <Attribute Name=\"COMPANYID\" LableResourceID=\"COMPANYID\" Description=\"所属公司ID\" DataType=\"string\" DataValue=\"721c99d5-4cfb-4cc7-ba43-a05217e25918\" DataText=\"721c99d5-4cfb-4cc7-ba43-a05217e25918\" />"); //sb.AppendLine(" <Attribute Name=\"COMPANYNAME\" LableResourceID=\"COMPANYNAME\" Description=\"所属公司名称\" DataType=\"string\" DataValue=\"集团公司\" DataText=\"集团公司\" />"); //sb.AppendLine(" <Attribute Name=\"APPLYDATE\" LableResourceID=\"APPLYDATE\" Description=\"申请日期\" DataType=\"datetime\" DataValue=\"2012/12/4 14:19:39\" DataText=\"2012/12/4 14:19:39\" />"); //sb.AppendLine(" <Attribute Name=\"APPLYMAN\" LableResourceID=\"APPLYMAN\" Description=\"申请人\" DataType=\"string\" DataValue=\"e65cdb8f-26f2-440c-a5f9-977ea29fe4c2\" DataText=\"e65cdb8f-26f2-440c-a5f9-977ea29fe4c2\" />"); //sb.AppendLine(" <Attribute Name=\"TASKSENDDATE\" LableResourceID=\"TASKSENDDATE\" Description=\"任务发放日期\" DataType=\"datetime\" DataValue=\"0001/1/1 0:00:00\" DataText=\"0001/1/1 0:00:00\" />"); //sb.AppendLine(" <Attribute Name=\"CHECKSTATES\" LableResourceID=\"CHECKSTATES\" Description=\"审核状态\" DataType=\"string\" DataValue=\"0\" DataText=\"0\" />"); //sb.AppendLine(" <Attribute Name=\"EDITSTATE\" LableResourceID=\"EDITSTATE\" Description=\"对象编辑状态\" DataType=\"string\" DataValue=\"2\" DataText=\"2\" />"); //sb.AppendLine(" <Attribute Name=\"OWNERCOMPANYID\" LableResourceID=\"OWNERCOMPANYID\" Description=\"记录所属公司ID\" DataType=\"string\" DataValue=\"721c99d5-4cfb-4cc7-ba43-a05217e25918\" DataText=\"721c99d5-4cfb-4cc7-ba43-a05217e25918\" />"); //sb.AppendLine(" <Attribute Name=\"OWNERDEPARTMENTID\" LableResourceID=\"OWNERDEPARTMENTID\" Description=\"记录所属部门ID\" DataType=\"string\" DataValue=\"7fc6b3af-92ec-442b-921e-6a8d13039ce9\" DataText=\"7fc6b3af-92ec-442b-921e-6a8d13039ce9\" />"); //sb.AppendLine(" <Attribute Name=\"OWNERPOSTID\" LableResourceID=\"OWNERPOSTID\" Description=\"记录所属岗位ID\" DataType=\"string\" DataValue=\"aa1496a5-840b-4b15-bc3e-36c2aeb14d3b\" DataText=\"aa1496a5-840b-4b15-bc3e-36c2aeb14d3b\" />"); //sb.AppendLine(" <Attribute Name=\"OWNERID\" LableResourceID=\"OWNERID\" Description=\"记录所属用户ID\" DataType=\"string\" DataValue=\"e65cdb8f-26f2-440c-a5f9-977ea29fe4c2\" DataText=\"e65cdb8f-26f2-440c-a5f9-977ea29fe4c2\" />"); //sb.AppendLine(" <Attribute Name=\"CREATECOMPANYID\" LableResourceID=\"CREATECOMPANYID\" Description=\"创建公司ID\" DataType=\"string\" DataValue=\"721c99d5-4cfb-4cc7-ba43-a05217e25918\" DataText=\"集团公司\" />"); //sb.AppendLine(" <Attribute Name=\"CREATEDEPARTMENTID\" LableResourceID=\"CREATEDEPARTMENTID\" Description=\"创建部门ID\" DataType=\"string\" DataValue=\"7fc6b3af-92ec-442b-921e-6a8d13039ce9\" DataText=\"总经办\" />"); //sb.AppendLine(" <Attribute Name=\"CREATEPOSTID\" LableResourceID=\"CREATEPOSTID\" Description=\"创建岗位ID\" DataType=\"string\" DataValue=\"aa1496a5-840b-4b15-bc3e-36c2aeb14d3b\" DataText=\"总经理\" />"); //sb.AppendLine(" <Attribute Name=\"CREATEUSERID\" LableResourceID=\"CREATEUSERID\" Description=\"创建人ID\" DataType=\"string\" DataValue=\"e65cdb8f-26f2-440c-a5f9-977ea29fe4c2\" DataText=\"黄总\" />"); //sb.AppendLine(" <Attribute Name=\"CREATEDATE\" LableResourceID=\"CREATEDATE\" Description=\"创建时间\" DataType=\"datetime\" DataValue=\"2012/12/4 14:19:39\" DataText=\"2012/12/4 14:19:39\" />"); //sb.AppendLine(" <Attribute Name=\"UPDATEUSERID\" LableResourceID=\"UPDATEUSERID\" Description=\"修改人ID\" DataType=\"string\" DataValue=\"e65cdb8f-26f2-440c-a5f9-977ea29fe4c2\" DataText=\"e65cdb8f-26f2-440c-a5f9-977ea29fe4c2\" />"); //sb.AppendLine(" <Attribute Name=\"UPDATEDATE\" LableResourceID=\"UPDATEDATE\" Description=\"修改时间\" DataType=\"datetime\" DataValue=\"2012/12/4 14:19:44\" DataText=\"2012/12/4 14:19:44\" />"); //sb.AppendLine(" <Attribute Name=\"REMARK\" LableResourceID=\"REMARK\" Description=\"备注\" DataType=\"string\" DataValue=\"\" DataText=\"\" />"); //sb.AppendLine(" <Attribute Name=\"ISMAJORDATA\" LableResourceID=\"ISMAJORDATA\" Description=\"是否主数据\" DataType=\"string\" DataValue=\"1\" DataText=\"1\" />"); //sb.AppendLine(" <Attribute Name=\"AUXIDNORMID\" LableResourceID=\"AUXIDNORMID\" Description=\"附属的主数据\" DataType=\"string\" DataValue=\"\" DataText=\"\" />"); //sb.AppendLine(" <Attribute Name=\"RECVERSION\" LableResourceID=\"RECVERSION\" Description=\"版本号\" DataType=\"string\" DataValue=\"1\" DataText=\"1\" />"); //sb.AppendLine(" <ObjectList Name=\"T_WP_YEARNORMDEFINE\" LableResourceID=\"T_WP_YEARNORMDEFINE\" Description=\"公司年度经营指标定义\" DataText=\"\" />"); //sb.AppendLine(" </Object>"); //sb.AppendLine("</System>"); //submitData.XML = sb.ToString(); //sb.Clear(); //SmulatedFlowService sfs = new SmulatedFlowService(); //sfs.SubimtFlow(submitData); //return null; #endregion SMTWorkFlowManage.ColseWorkFlowRuntime(null); DataSet ds = new DataSet(); WriteSubmitDate(submitData); LogHelper.WriteLog("***********************************************开始" + DateTime.Now.ToString() + "***********************************************"); string returnMsg = "";//暂时没有用,记录执行的顺序 #region 更新个人缓存 FlowEngine.TaskCacheReflesh(submitData.ApprovalUser.UserID); LogHelper.WriteLog("FormID=" + submitData.FormID + ";更新个人缓存 完成 UserID=" + submitData.ApprovalUser.UserID); #endregion // MsOracle.BeginTransaction(con); DateTime dtStart = DateTime.Now; DateTime dtEngineStart = DateTime.Now; DateTime dtEnd = DateTime.Now; DateTime dtCheckData = DateTime.Now; DataResult dataResult = new DataResult(); FlowUser User = new FlowUser(); //using (TransactionScope ts = new TransactionScope()) //设置2分钟超时时间 using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required, new TimeSpan(DateTime.Now.AddMinutes(2).Ticks))) { LogHelper.WriteLog("进入事务操作 FormID=" + submitData.FormID); OracleConnection con = ADOHelper.GetOracleConnection(); LogHelper.WriteLog("打开数据库 完成 FormID=" + submitData.FormID); #region 事务处理 #region 初始化流程所属人的信息 User = new FlowUser(submitData.ApprovalUser.CompanyID, submitData.ApprovalUser.UserID, con, submitData.ModelCode); User.FormID = submitData.FormID; LogHelper.WriteLog("初始化流程所属人的信息 FormID=" + submitData.FormID); SUser = User; LogHelper.WriteLog("SUser = User FormID=" + submitData.FormID); #endregion //System.Threading.Thread.Sleep(60000); //DataResult dataResult = new DataResult(); FlowBLL Flowbill = new FlowBLL(); string AppCompanyID = ""; //申请公司 string MessageUserID = ""; //申请人ID string MessageUserName = ""; //申请人名 dataResult.FlowResult = FlowResult.SUCCESS; try { #region 检查流程数据是否规范 if (!FlowBLL.CheckFlowData(submitData, ref dataResult)) { dataResult.FlowResult = FlowResult.FAIL; { //ts.Complete(); return dataResult; } } #region XML进行验证 if (!string.IsNullOrEmpty(submitData.XML) && submitData.SubmitFlag == SubmitFlag.New) {//如果是提交并XML不为空是进行验证 if (VerifyXML(submitData.XML)) { dataResult.Err = "传入的XML不合法!请检查元数据Key值和DataValue值是否有空的"; dataResult.FlowResult = FlowResult.FAIL; FlowMonitor.AddFlowMonitor(submitData, User); return dataResult; } } if (string.IsNullOrEmpty(submitData.XML) && submitData.SubmitFlag == SubmitFlag.New) {//如果是提交并XML为空 dataResult.Err = "XML元数据不能为空!"; dataResult.FlowResult = FlowResult.FAIL; FlowMonitor.AddFlowMonitor(submitData, User); return dataResult; } #endregion #endregion submitData.ApprovalResult = submitData.SubmitFlag == SubmitFlag.New ? ApprovalResult.Pass : submitData.ApprovalResult; submitData.FlowSelectType = submitData.FlowSelectType == null ? FlowSelectType.FixedFlow : submitData.FlowSelectType; #region 新增,撤单,审核 #region 检查是否已提交流程(对数据库操作) OracleConnection ocon = ADOHelper.GetOracleConnection(); CheckResult CheckFlowResult = Flowbill.CheckFlow2(ocon, submitData, dataResult);//对数据库操作 dtCheckData = DateTime.Now; dataResult = CheckFlowResult.APPDataResult; if (CheckFlowResult.Flag == 0 && submitData.SubmitFlag == SubmitFlag.New)//已审批:1,未审批:0 { //ts.Complete(); dataResult.Err = "该单据已提交,还没有审核,不能再提交!"; dataResult.FlowResult = FlowResult.FAIL; return dataResult; } if (CheckFlowResult.fd!=null && CheckFlowResult.fd[0].CHECKSTATE == "1" && submitData.SubmitFlag == SubmitFlag.New)//审核中:1 {//如果单据还在审核中,不允许再提交单据 //ts.Complete(); dataResult.Err = "该单据已在审核中,不能再提交!"; dataResult.FlowResult = FlowResult.FAIL; return dataResult; } if (ocon.State == ConnectionState.Open) { ocon.Close(); } #endregion dataResult.AppState = submitData.NextStateCode; //提交新流程 if (submitData.SubmitFlag == SubmitFlag.New) { #region 新增 AppCompanyID = submitData.ApprovalUser.CompanyID; if (submitData.FlowSelectType == FlowSelectType.FreeFlow) //自选流程 dataResult = Flowbill.AddFreeFlow(con, submitData, dataResult, ref User);//对数据库操作 else { //固定流程 LogHelper.WriteLog("固定流程.Flowbill.AddFlow2"); dataResult = Flowbill.AddFlow2(con, submitData, dataResult, ref User);//对数据库操作 } #endregion } else if (submitData.SubmitFlag == SubmitFlag.Cancel) { #region 撤单 if (!string.IsNullOrEmpty(CheckFlowResult.fd[0].FLOW_FLOWRECORDMASTER_T.BUSINESSOBJECT)) { submitData.XML = CheckFlowResult.fd[0].FLOW_FLOWRECORDMASTER_T.BUSINESSOBJECT; } submitData.ApprovalContent = ""; dataResult = Flowbill.CancelFlow(submitData, dataResult, CheckFlowResult.fd); dataResult.SubmitFlag = submitData.SubmitFlag; #endregion } //审批流程 else { if (CheckFlowResult.fd[0] == null) { dataResult.Err = "FormID =" + submitData.FormID + ";该单据没有审核记录!"; dataResult.FlowResult = FlowResult.FAIL; return dataResult; } #region 审核 if (!string.IsNullOrEmpty(CheckFlowResult.fd[0].FLOW_FLOWRECORDMASTER_T.BUSINESSOBJECT)) { submitData.XML = CheckFlowResult.fd[0].FLOW_FLOWRECORDMASTER_T.BUSINESSOBJECT; } //引擎消息数据 AppCompanyID = CheckFlowResult.fd[0].FLOW_FLOWRECORDMASTER_T.CREATECOMPANYID; MessageUserID = CheckFlowResult.fd[0].FLOW_FLOWRECORDMASTER_T.CREATEUSERID; MessageUserName = CheckFlowResult.fd[0].FLOW_FLOWRECORDMASTER_T.CREATEUSERNAME; submitData.ApprovalUser.CompanyID = CheckFlowResult.fd[0].EDITCOMPANYID; submitData.ApprovalUser.DepartmentID = CheckFlowResult.fd[0].EDITDEPARTMENTID; submitData.ApprovalUser.PostID = CheckFlowResult.fd[0].EDITPOSTID; submitData.FlowSelectType = (FlowSelectType)Convert.ToInt32(CheckFlowResult.fd[0].FLOW_FLOWRECORDMASTER_T.FLOWSELECTTYPE); if (submitData.FlowSelectType == FlowSelectType.FreeFlow) dataResult = Flowbill.ApprovalFreeFlow(con, submitData, dataResult, CheckFlowResult.fd, ref User);//对数据库操作、对服务操作 else dataResult = Flowbill.ApprovalFlow2(con, submitData, dataResult, CheckFlowResult.fd, ref User, ref returnMsg); #endregion } #endregion if (dataResult.FlowResult == FlowResult.MULTIUSER) { #region 如果检出有多个审核人时,返回界面让用户选择一个人进行审核 string users = "FormID =" + submitData.FormID + " 检出有多个审核人\r\n"; foreach (var u in dataResult.UserInfo) { //users += "CompanyID =" + u.CompanyID + "\r\n"; //users += "DepartmentID = " + u.DepartmentID + "\r\n"; //users += "PostID = " + u.PostID + "\r\n"; //users += "serID = " + u.UserID + "\r\n"; //users += "UserName = "******"\r\n"; users += "公司ID = " + u.CompanyID + "\r\n"; users += "部门ID = " + u.DepartmentID + "\r\n"; users += "岗位ID = " + u.PostID + "\r\n"; users += "员工ID = " + u.UserID + "\r\n"; users += "公司名称 = " + u.CompanyName + "\r\n"; users += "部门名称 = " + u.DepartmentName + "\r\n"; users += "岗位名称 = " + u.PostName + "\r\n"; users += "员工姓名 = " + u.UserName + "\r\n"; users += "------------------------------------\r\n"; } LogHelper.WriteLog(users + "返回界面让用户选择一个人审核人"); for (int i = 0; i < dataResult.UserInfo.Count; i++) { dataResult.UserInfo[i].Roles = null; //解决 基础连接已经关闭: 连接被意外关闭(WCF深层序列化问题) } return dataResult; #endregion } for (int i = 0; i < dataResult.UserInfo.Count; i++) { dataResult.UserInfo[i].Roles = null; //解决 基础连接已经关闭: 连接被意外关闭(WCF深层序列化问题) } if (dataResult.DictCounterUser != null) { if (dataResult.DictCounterUser.Count > 0) { string name = ""; foreach (KeyValuePair<Role_UserType, List<UserInfo>> u in dataResult.DictCounterUser) { name += "角色名称:" + u.Key.Remark + " 人数:" + u.Value.Count + "\r\n"; foreach (var user in u.Value) { user.Roles = null;//解决 基础连接已经关闭: 连接被意外关闭(WCF深层序列化问题) name += "姓名:" + user.UserName + " 公司:" + user.CompanyName + "\r\n"; } name += "---------------------------------------------------------------\r\n"; } LogHelper.WriteLog("FormID=" + User.FormID + " 会签角色下所有的人员 \r\n" + name); } } //return null; //return dataResult;//测试检查流程用的,不能提交事务 LogHelper.WriteLog("FormID=" + User.FormID + " 模块名称:user.ModelCode=" + User.ModelCode + "; user.ModelName=" + User.ModelName + " ;流程名称=" + User.FlowName + "(" + User.FlowCode + ")"); if (string.IsNullOrEmpty(strIsFlowEngine) || strIsFlowEngine.ToLower() == "true") { #region 发送审批消息(调用引擎服务) SubmitEngineService(con, submitData, dataResult, ref User, CheckFlowResult, Flowbill, AppCompanyID, MessageUserID, MessageUserName, ref returnMsg); #endregion } //修改我的单据状态 新建并且不能不等于会签才更改状态 if (submitData.SubmitFlag == SubmitFlag.New && dataResult.FlowResult==FlowResult.SUCCESS ) { EnginFlowBLL.AddPersonalRecord(con, submitData, "1", User, null); } if (dataResult.FlowResult == FlowResult.END) { EnginFlowBLL.AddPersonalRecord(con, submitData, dataResult.CheckState, User, CheckFlowResult.fd[0].FLOW_FLOWRECORDMASTER_T); } dtEnd = DateTime.Now; dataResult.SubmitFlag = submitData.SubmitFlag; if (dataResult.FlowResult == FlowResult.FAIL) { dataResult.Err = dataResult.Err + " \r\n FormID=" + User.FormID + ";时间:" + DateTime.Now.ToString(); User.ErrorMsg += "=================================================================================\r\n"; User.ErrorMsg += dataResult.Err + "\r\n"; FlowMonitor.AddFlowMonitor(submitData, User); } #region 审核结束时关闭所有的流程资讯在待办中 //if (dataResult.FlowResult == FlowResult.END) //{ // EnginFlowBLL FlowEngine = new EnginFlowBLL(); // FlowEngine.FlowConsultatiCloseAll(con, submitData.ModelCode, submitData.FormID); //} #endregion ts.Complete();//提交事务 MsOracle.Close(con);//关闭数据库 LogHelper.WriteLog("执行流程成功:FormID=" + User.FormID + ";单据所属人:" + User.UserName + "("+User.UserID+");公司名称:" + User.CompayName + ";模块名称:" + User.ModelName + " ;流程名称:" + User.FlowName + " (" + User.FlowCode + ") \r\n 返回给业务系统的 dataResult.FlowResult=" + dataResult.FlowResult.ToString() + " " + dataResult.Err); //FlowMonitor.AddInstance(submitData); //return dataResult; } catch (Exception ex) { ts.Dispose(); if (con.State == System.Data.ConnectionState.Open) { con.Close(); con.Dispose(); } dataResult.RunTime += "---FlowEnd:" + DateTime.Now.ToString(); dataResult.FlowResult = FlowResult.FAIL; // Flowbill = null; dataResult.Err = ex.Message; #region 记录到流程监控表里 User.ErrorMsg += "=================================================================================\r\n"; User.ErrorMsg += "执行流程失败:FormID=" + User.FormID + ";单据所属人:" + User.UserName + "(" + User.UserID + ");公司名称:" + User.CompayName + ";模块名称:" + User.ModelName + "; 流程名称:" + User.FlowName + " (" + User.FlowCode + "); 异常信息\r\n" + ex.ToString() + "\r\n"; FlowMonitor.AddFlowMonitor(submitData, User); #endregion #region restore workflow instanceState if (User.InstanceState != null && User.InstanceState.Tables[0].Rows.Count > 0) { foreach (DataRow dr in User.InstanceState.Tables[0].Rows) { LogHelper.WriteLog("恢复工作流InstanceState:" + dr["instance_id"]); InsertInstanceState(dr); //WorkflowRuntime workflowRuntime = SMTWorkFlowManage.CreateWorkFlowRuntime(true); //WorkflowInstance instance = SMTWorkFlowManage.GetWorkflowInstance(workflowRuntime,dr["instance_id"].ToString());// workflowRuntime.GetWorkflow(new Guid(tmp[0].FLOW_FLOWRECORDMASTER_T.INSTANCEID)); //LogHelper.WriteLog("恢复运行工作流InstanceState:" + dr["instance_id"]); } } #endregion if (dataResult.FlowResult == FlowResult.FAIL) { dataResult.Err = dataResult.Err + " FormID=" + User.FormID + ";时间:" + DateTime.Now.ToString(); LogHelper.WriteLog("失败错误信息:"+dataResult.Err); } LogHelper.WriteLog("执行流程失败:FormID=" + User.FormID + ";单据所属人:" + User.UserName + "(" + User.UserID + ");公司名称:" + User.CompayName + ";模块名称:" + User.ModelName + "; 流程名称:" + User.FlowName + " (" + User.FlowCode + ");执行踪信息如下:\r\n" + User.TrackingMessage + "\r\n 异常信息\r\n" + ex.ToString()); return dataResult; } finally { if (Flowbill.workflowRuntime != null && Flowbill.workflowRuntime.IsStarted) { //Flowbill.workflowRuntime.Dispose(); } if (con.State == System.Data.ConnectionState.Open) { con.Close(); con.Dispose(); } //dataResult = null; // LogHelper.WriteLog("-------Trace--FormID:" + submitData.FormID + "DateTime: Start:" + dtStart.ToString() + " EngineStart:" + dtEngineStart.ToString() + " End:" + dtEnd.ToString() + "\n"); } #endregion } FlowMonitor.AddInstance(submitData,User); return dataResult; }
private bool SendDotask(string submitUserName, string modeName, string msgOpen, T_WF_DOTASK Entity, string IsTask, ref FlowUser sUser, ref string ErroMessage) { bool result = false; dal = new EnginFlowDAL(); strAppFieldValue = string.Empty; //sUser.TrackingMessage+="开始将数据源字段转换成数据表 FORMID="+sUser.FormID+"r\n"; //将业务数据与流程数据转换成DataTable作为替换的源数据 sourceTable = FieldStringToDataTable(Entity.APPFIELDVALUE, ref strAppFieldValue); //sUser.TrackingMessage += "结束将数据源字段转换成数据表 FORMID=" + sUser.FormID + "r\n"; //通过系统代号,模块代号,企业ID,流程状态查到引擎配置内容 //Tracer.Debug("开始通过系统代号,模块代号,企业ID,流程状态查[消息规则]内容 FORMID=" + sUser.FormID + ""); dtFlowTrigger = dal.FlowTriggerTable(Entity.SYSTEMCODE, Entity.MODELCODE, Entity.ORDERSTATUS.ToString(), Entity.COMPANYID); //Tracer.Debug("结束通过系统代号,模块代号,企业ID,流程状态查[消息规则]内容 FORMID=" + sUser.FormID + ""); if (dtFlowTrigger == null || dtFlowTrigger.Rows.Count == 0) { //sUser.ErrorMsg += "没有找到[消息规则]内容 再次通过全局默认消息继续查找 FORMID=" + sUser.FormID + " 异常信息:" + ErroMessage + "\r\n"; //Tracer.Debug("dtFlowTrigger=null或者dtFlowTrigger.Rows.Count == 0 没有找到[消息规则]内容 再次通过全局默认消息继续查找 FORMID=" + sUser.FormID + ""); dtFlowTrigger = dal.FlowTriggerTable(Entity.SYSTEMCODE, Entity.MODELCODE, Entity.ORDERSTATUS.ToString()); } //if (dtFlowTrigger != null && dtFlowTrigger.Rows.Count > 0) //{ //} //else //{ // //string strMsg = "系统代号:" + Entity.SYSTEMCODE + "\r\n" + // // "模块代号:" + Entity.MODELCODE + "\r\n" + // // "触发条件:" + Entity.ORDERSTATUS + "\r\n" + // // "公司 ID:" + Entity.COMPANYID + "\r\n" + // // "单据 ID:" + Entity.ORDERID; // //ErroMessage = "FORMID=" + sUser.FormID + " 发送待办任务失败, 该单据所对应的[消息规则]设置未找到,请先配置公司[" + sUser.CompayName+ "("+sUser.CompayID+")] 下的模块[ " + sUser.ModelName + " ]的 [消息规则](审核通过、审核不通过、审核中):\r\n" + strMsg; // //sUser.ErrorMsg += "发送待办任务失败 FORMID=" + sUser.FormID + " 异常信息:" + ErroMessage + "\r\n"; // //Tracer.Debug(ErroMessage); // //暂是没有默认消息也可以审核通过 // // throw new Exception("该单据所对应的引擎系统设置未找到,请先配置该模块 " + sUser.ModelName + " 引擎消息(审核通过、审核不通过、审核中)"); //} #region 发送待办任务(不管有没有配置消息规则,都发送待办任务) DataRow[] drs = new DataRow[] { }; if (dtFlowTrigger != null && dtFlowTrigger.Rows.Count > 0) { drs = dtFlowTrigger.Select("ISDEFAULTMSG=1");//不管有没有配置 } //edit by ken 2015-7-17 //if (drs.Count() > 0) //{ //sUser.ErrorMsg += "发现默认流程触发[消息规则]内容 FORMID=" + sUser.FormID + " IsTask:" + IsTask.ToString() + "\r\n"; //Tracer.Debug("FORMID=" + sUser.FormID + " 发现默认流程触发消息规则 IsTask=" + IsTask.ToString()); //if (IsTask == "1")//新增待办任务 //{ dal.AddDoTask(Entity, drs, sourceTable, strAppFieldValue, submitUserName, modeName, msgOpen);//新增待办任务 //FlowEngine.TaskCacheReflesh(Entity.RECEIVEUSERID); //} //else if (IsTask == "0")//消息 //{ //dal.AddDoTaskMessage(Entity, drs[0], sourceTable); //} //} //else //{ // sUser.ErrorMsg += "没有发现默认流程触发(审核通过、审核不通过、审核中)[消息规则]内容 FORMID=" + sUser.FormID + " IsTask:" + IsTask.ToString() + "\r\n"; // Tracer.Debug("FORMID=" + sUser.FormID + " 没有发现默认流程触发(审核通过、审核不通过、审核中)消息规则 "); // //throw new Exception("该单据所对应的默认[消息规则]设置未找到,请先配置该模块 " + sUser.ModelName + " 默认消息规则(审核通过、审核不通过、审核中)"); //} //end edit by ken 2015-7-17 DataRow[] NotDefaultMsg = dtFlowTrigger.Select("ISDEFAULTMSG=0");//非默认消息,需要调用的WCF待办任务 if (NotDefaultMsg != null && NotDefaultMsg.Count() > 0) { //AutoCallFlow( dal,Entity,dtFlowTrigger,sourceTable, ref sUser, strAppFieldValue, ref ErroMessage); #region 非默认消息时,自动发起流程 //foreach (DataRow dr1 in NotDefaultMsg) //{ // string strAppMsg = string.Empty; // CallWCFService( dr1, sourceTable, ref sUser, ref strAppMsg, ref ErroMessage);//调用WCF服务 // if (!string.IsNullOrEmpty(strAppMsg)) // { // try // { // string IsNewFlow = "1"; // string NewFormID = string.Empty; // string strFormTypes = string.Empty;//表单状态 // DataRow DRNewTrigger = null; // if (ApplicationValueToDataTable( strAppMsg, string.Concat(Entity.COMPANYID), ref sourceTable, ref IsNewFlow, ref NewFormID, ref strFormTypes, ref DRNewTrigger)) // { // //通过岗位查找用户,并且取第一个用户为发送消息的对像 // PersonnelServiceClient HRClient = new PersonnelServiceClient(); // if (!string.IsNullOrEmpty(dr1["OWNERPOSTID"].ToString())) // { // string[] Employees = HRClient.GetEmployeeIDsByPostID(dr1["OWNERPOSTID"].ToString()); // if (Employees != null && Employees.Count() > 0) // { // dal.AddDoTask( Entity, dr1, sourceTable, Employees[0], NewFormID, strAppFieldValue, string.Concat(dr1["MESSAGEBODY"]), strFormTypes);//发送消息 // } // } // else // { // string cMessage = "引擎调用新流程时没有选定岗位 SystemCode:" + string.Concat(DRNewTrigger["SYSTEMCODE"]) + " MODELCODE:" + string.Concat(DRNewTrigger["MODELCODE"]) + " NewFormID:" + NewFormID; // ErroMessage = cMessage; // throw new Exception("命名空间:SMT.FlowWFService.EnginFlowBLL类方法:EngineExecute()引擎调用新流程时没有选定岗位"); // } // } // } // catch (Exception ex) // { // throw new Exception("命名空间:SMT.FlowWFService.EnginFlowBLL类方法:EngineExecute() FORMID=" + sUser.FormID + "" + ex.Message); // } // } //} #endregion } result = true; #endregion return result; }
public DataResult SubimtFlow(SubmitData submitData) { //SMTWorkFlowManage.ColseWorkFlowRuntime(null); //DataSet ds = new DataSet(); LogSubmitData(submitData); Tracer.Debug("***********************************************开始***********************************************"); string returnMsg = "";//暂时没有用,记录执行的顺序 #region 更新个人缓存 //临时屏蔽 //FlowEngine.TaskCacheReflesh(submitData.ApprovalUser.UserID); //Tracer.Debug("FormID=" + submitData.FormID + ";更新个人缓存 完成 UserID=" + submitData.ApprovalUser.UserID); #endregion DateTime dtStart = DateTime.Now; DateTime dtEngineStart = DateTime.Now; DateTime dtEnd = DateTime.Now; DateTime dtCheckData = DateTime.Now; DataResult dataResult = new DataResult(); FlowUser User = new FlowUser(); //设置2分钟超时时间 //using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required, new TimeSpan(DateTime.Now.AddMinutes(2).Ticks))) //{ try { #region 初始化流程所属人的信息 Tracer.Debug("进入事务操作 FormID=" + submitData.FormID); User = new FlowUser(submitData.ApprovalUser.CompanyID, submitData.ApprovalUser.UserID, submitData.ModelCode); User.FormID = submitData.FormID; Tracer.Debug("初始化流程所属人的信息 FormID=" + submitData.FormID); SUser = User; Tracer.Debug("SUser = User FormID=" + submitData.FormID); FlowBLL Flowbll = new FlowBLL(); string AppCompanyID = ""; //申请公司 string MessageUserID = ""; //申请人ID string MessageUserName = ""; //申请人名 dataResult.FlowResult = FlowResult.SUCCESS; #endregion #region 检查流程数据是否规范 if (!FlowBLL.CheckFlowData(submitData, ref dataResult)) { dataResult.FlowResult = FlowResult.FAIL; { return dataResult; } } #region XML进行验证 if (!string.IsNullOrEmpty(submitData.XML) && submitData.SubmitFlag == SubmitFlag.New) {//如果是提交并XML不为空是进行验证 if (VerifyXML(submitData.XML)) { dataResult.Err = "传入的XML不合法!请检查元数据Key值和DataValue值是否有空的"; dataResult.FlowResult = FlowResult.FAIL; FlowMonitor.AddFlowMonitor(submitData, User); return dataResult; } } if (string.IsNullOrEmpty(submitData.XML) && submitData.SubmitFlag == SubmitFlag.New) {//如果是提交并XML为空 dataResult.Err = "XML元数据不能为空!"; dataResult.FlowResult = FlowResult.FAIL; FlowMonitor.AddFlowMonitor(submitData, User); return dataResult; } #endregion #endregion #region 检查是否已提交流程(对数据库操作) submitData.ApprovalResult = submitData.SubmitFlag == SubmitFlag.New ? ApprovalResult.Pass : submitData.ApprovalResult; submitData.FlowSelectType = submitData.FlowSelectType == null ? FlowSelectType.FixedFlow : submitData.FlowSelectType; CheckResult CheckFlowResult = Flowbll.CheckFlowIsApproved(submitData, dataResult);//对数据库操作 dtCheckData = DateTime.Now; dataResult = CheckFlowResult.APPDataResult; if (CheckFlowResult.Flag == 0 && submitData.SubmitFlag == SubmitFlag.New)//已审批:1,未审批:0 { dataResult.Err = "该单据已提交,还没有审核,不能再提交!"; dataResult.FlowResult = FlowResult.FAIL; return dataResult; } if (CheckFlowResult.fd != null && CheckFlowResult.fd[0].CHECKSTATE == "1" && submitData.SubmitFlag == SubmitFlag.New)//审核中:1 {//如果单据还在审核中,不允许再提交单据 dataResult.Err = "该单据已在审核中,不能再提交!"; dataResult.FlowResult = FlowResult.FAIL; return dataResult; } #endregion #region 新增,撤单,审核 dataResult.AppState = submitData.NextStateCode; if (submitData.SubmitFlag == SubmitFlag.New) { //提交新流程 #region 新增 AppCompanyID = submitData.ApprovalUser.CompanyID; if (submitData.FlowSelectType == FlowSelectType.FreeFlow) //自选流程 dataResult = Flowbll.SubmitFreeFlow(submitData, dataResult, ref User);//对数据库操作 else { //固定流程 Tracer.Debug("固定流程.Flowbill.AddFlow2"); dataResult = Flowbll.SubmitFlow(submitData, dataResult, ref User);//对数据库操作 } #endregion } else if (submitData.SubmitFlag == SubmitFlag.Cancel) { #region 撤单 if (!string.IsNullOrEmpty(CheckFlowResult.fd[0].FLOW_FLOWRECORDMASTER_T.BUSINESSOBJECT)) { submitData.XML = CheckFlowResult.fd[0].FLOW_FLOWRECORDMASTER_T.BUSINESSOBJECT; } submitData.ApprovalContent = ""; dataResult = Flowbll.CancelFlow(submitData, dataResult, CheckFlowResult.fd); dataResult.SubmitFlag = submitData.SubmitFlag; #endregion } else { //审批流程 #region 审核 if (CheckFlowResult.fd[0] == null) { dataResult.Err = "FormID =" + submitData.FormID + ";该单据没有审核记录!"; dataResult.FlowResult = FlowResult.FAIL; return dataResult; } if (!string.IsNullOrEmpty(CheckFlowResult.fd[0].FLOW_FLOWRECORDMASTER_T.BUSINESSOBJECT)) { submitData.XML = CheckFlowResult.fd[0].FLOW_FLOWRECORDMASTER_T.BUSINESSOBJECT; } //引擎消息数据 AppCompanyID = CheckFlowResult.fd[0].FLOW_FLOWRECORDMASTER_T.CREATECOMPANYID; MessageUserID = CheckFlowResult.fd[0].FLOW_FLOWRECORDMASTER_T.CREATEUSERID; MessageUserName = CheckFlowResult.fd[0].FLOW_FLOWRECORDMASTER_T.CREATEUSERNAME; submitData.ApprovalUser.CompanyID = CheckFlowResult.fd[0].EDITCOMPANYID; submitData.ApprovalUser.DepartmentID = CheckFlowResult.fd[0].EDITDEPARTMENTID; submitData.ApprovalUser.PostID = CheckFlowResult.fd[0].EDITPOSTID; submitData.FlowSelectType = (FlowSelectType)Convert.ToInt32(CheckFlowResult.fd[0].FLOW_FLOWRECORDMASTER_T.FLOWSELECTTYPE); if (submitData.FlowSelectType == FlowSelectType.FreeFlow) dataResult = Flowbll.ApprovalFreeFlow(submitData, dataResult, CheckFlowResult.fd, ref User);//对数据库操作、对服务操作 else dataResult = Flowbll.ApprovalFlow(submitData, dataResult, CheckFlowResult.fd, ref User, ref returnMsg); #endregion } #endregion #region 如果检出有多个审核人时,返回界面让用户选择一个人进行审核 if (dataResult.FlowResult == FlowResult.MULTIUSER) { string users = "FormID =" + submitData.FormID + " 检出有多个审核人\r\n"; foreach (var u in dataResult.UserInfo) { //users += "CompanyID =" + u.CompanyID + "\r\n"; //users += "DepartmentID = " + u.DepartmentID + "\r\n"; //users += "PostID = " + u.PostID + "\r\n"; //users += "serID = " + u.UserID + "\r\n"; //users += "UserName = "******"\r\n"; users += "公司ID = " + u.CompanyID + "\r\n"; users += "部门ID = " + u.DepartmentID + "\r\n"; users += "岗位ID = " + u.PostID + "\r\n"; users += "员工ID = " + u.UserID + "\r\n"; users += "公司名称 = " + u.CompanyName + "\r\n"; users += "部门名称 = " + u.DepartmentName + "\r\n"; users += "岗位名称 = " + u.PostName + "\r\n"; users += "员工姓名 = " + u.UserName + "\r\n"; users += "------------------------------------\r\n"; } Tracer.Debug(users + "返回界面让用户选择一个人审核人"); for (int i = 0; i < dataResult.UserInfo.Count; i++) { dataResult.UserInfo[i].Roles = null; //解决 基础连接已经关闭: 连接被意外关闭(WCF深层序列化问题) } return dataResult; } #endregion #region 解决 基础连接已经关闭: 连接被意外关闭(WCF深层序列化问题) for (int i = 0; i < dataResult.UserInfo.Count; i++) { dataResult.UserInfo[i].Roles = null; //解决 基础连接已经关闭: 连接被意外关闭(WCF深层序列化问题) } if (dataResult.DictCounterUser != null) { if (dataResult.DictCounterUser.Count > 0) { string name = ""; foreach (KeyValuePair<FlowRole, List<UserInfo>> u in dataResult.DictCounterUser) { name += "角色名称:" + u.Key.Remark + " 人数:" + u.Value.Count + "\r\n"; foreach (var user in u.Value) { user.Roles = null;//解决 基础连接已经关闭: 连接被意外关闭(WCF深层序列化问题) name += "姓名:" + user.UserName + " 公司:" + user.CompanyName + "\r\n"; } name += "---------------------------------------------------------------\r\n"; } Tracer.Debug("FormID=" + User.FormID + " 会签角色下所有的人员 \r\n" + name); } } #endregion #region 发送审批消息(调用引擎服务) Tracer.Debug("FormID=" + User.FormID + " 模块名称:user.ModelCode=" + User.ModelCode + "; user.ModelName=" + User.ModelName + " ;流程名称=" + User.FlowName + "(" + User.FlowCode + ")"); if (string.IsNullOrEmpty(strIsFlowEngine) || strIsFlowEngine.ToLower() == "true") { SubmitEngineService(submitData, dataResult, ref User, CheckFlowResult, Flowbll, AppCompanyID, MessageUserID, MessageUserName, ref returnMsg); } #endregion #region 修改我的单据状态 //修改我的单据状态 新建并且不能不等于会签才更改状态 if (submitData.SubmitFlag == SubmitFlag.New && dataResult.FlowResult == FlowResult.SUCCESS) { EnginFlowBLL.AddPersonalRecord(submitData, "1", User, null); } if (dataResult.FlowResult == FlowResult.END) { EnginFlowBLL.AddPersonalRecord(submitData, dataResult.CheckState, User, CheckFlowResult.fd[0].FLOW_FLOWRECORDMASTER_T); } dtEnd = DateTime.Now; dataResult.SubmitFlag = submitData.SubmitFlag; if (dataResult.FlowResult == FlowResult.FAIL) { dataResult.Err = dataResult.Err + " \r\n FormID=" + User.FormID + ";时间:" + DateTime.Now.ToString(); User.ErrorMsg += "=================================================================================\r\n"; User.ErrorMsg += dataResult.Err + "\r\n"; FlowMonitor.AddFlowMonitor(submitData, User); } #endregion //ts.Complete();//提交事务 //关闭数据库 Tracer.Debug("执行流程成功:FormID=" + User.FormID + ";单据所属人:" + User.UserName + "(" + User.UserID + ");公司名称:" + User.CompayName + ";模块名称:" + User.ModelName + " ;流程名称:" + User.FlowName + " (" + User.FlowCode + ") \r\n 返回给业务系统的 dataResult.FlowResult=" + dataResult.FlowResult.ToString() + " " + dataResult.Err); } catch (Exception ex) { #region 记录到流程监控表里 //ts.Dispose(); dataResult.RunTime += "---FlowEnd:" + DateTime.Now.ToString(); dataResult.FlowResult = FlowResult.FAIL; dataResult.Err = ex.Message; User.ErrorMsg += "=================================================================================\r\n"; User.ErrorMsg += "执行流程失败:FormID=" + User.FormID + ";单据所属人:" + User.UserName + "(" + User.UserID + ");公司名称:" + User.CompayName + ";模块名称:" + User.ModelName + "; 流程名称:" + User.FlowName + " (" + User.FlowCode + "); 异常信息\r\n" + ex.ToString() + "\r\n"; FlowMonitor.AddFlowMonitor(submitData, User); #endregion #region restore workflow instanceState if (User.InstanceState != null && User.InstanceState.Tables[0].Rows.Count > 0) { foreach (DataRow dr in User.InstanceState.Tables[0].Rows) { Tracer.Debug("恢复工作流InstanceState:" + dr["instance_id"]); InsertInstanceState(dr); } } #endregion #region return FAIL result if (dataResult.FlowResult == FlowResult.FAIL) { dataResult.Err = dataResult.Err + " FormID=" + User.FormID + ";时间:" + DateTime.Now.ToString(); Tracer.Debug("失败错误信息:" + dataResult.Err); } Tracer.Debug("执行流程失败:FormID=" + User.FormID + ";单据所属人:" + User.UserName + "(" + User.UserID + ");公司名称:" + User.CompayName + ";模块名称:" + User.ModelName + "; 流程名称:" + User.FlowName + " (" + User.FlowCode + ");执行踪信息如下:\r\n" + User.TrackingMessage + "\r\n 异常信息\r\n" + ex.ToString()); return dataResult; #endregion } finally { } //} FlowMonitor.AddInstance(submitData, User); return dataResult; }
/// <summary> /// 新增流程(对数据库操作) /// </summary> /// <param name="ApprovalData"></param> /// <param name="APPDataResult"></param> /// <returns></returns> public DataResult AddFlow2(OracleConnection con, SubmitData submitData, DataResult dataResult, ref FlowUser user) { // WorkflowRuntime workflowRuntime = null; WorkflowInstance instance = null; try { #region 获取定义的流程 user.TrackingMessage += "获取定义的流程.GetFlowByModelName:submitData.ApprovalUser.DepartmentID=" + submitData.ApprovalUser.DepartmentID + ";OrgType='" + ((int)submitData.FlowType).ToString() + "'"; List<FLOW_MODELFLOWRELATION_T> MODELFLOWRELATION = GetFlowByModelName(con, submitData.ApprovalUser.CompanyID, submitData.ApprovalUser.DepartmentID, submitData.ModelCode, ((int)submitData.FlowType).ToString(), ref user);//对数据库操作 if (MODELFLOWRELATION == null || MODELFLOWRELATION.Count == 0) { dataResult.FlowResult = FlowResult.FAIL; dataResult.Err = "没有找到可使用的流程"; if (submitData.ApprovalUser.CompanyID == user.CompayID && submitData.ApprovalUser.DepartmentID == user.DepartmentID) { dataResult.Err = "没有找到公司[ " + user.CompayName + " ]下部门[ " + user.DepartmentName + " ]的匹配流程返回"; } else { dataResult.Err = "没有找到公司[ " + user.CompayName + " ]的可使用匹配流程"; } return dataResult; } #endregion FLOW_MODELFLOWRELATION_T flowRelation = MODELFLOWRELATION[0];//只取其中一条流程 FLOW_FLOWDEFINE_T flowDefine = flowRelation.FLOW_FLOWDEFINE_T; user.FlowCode = flowDefine.FLOWCODE;//流程代码 user.FlowName = flowDefine.DESCRIPTION;//流程名称 if (flowDefine.RULES != null && flowDefine.RULES.Trim() == "") { flowDefine.RULES = null; } workflowRuntime = SMTWorkFlowManage.CreateWorkFlowRuntime(true); instance = SMTWorkFlowManage.CreateWorkflowInstance(workflowRuntime, flowDefine.XOML, flowDefine.RULES); LogHelper.WriteLog("新增 FormID=" + user.FormID + " 流程名称=" + flowDefine.DESCRIPTION + "("+flowDefine.FLOWCODE+") 提交人=" + user.UserName + " 公司名称=" + user.CompayName + " 部门名称=" + user.DepartmentName + " 岗位名称=" + user.PostName + " WorkflowInstance ID=" + instance.InstanceId.ToString()); workflowRuntime.WorkflowCompleted += delegate(object sender, WorkflowCompletedEventArgs e) { instance = null; }; #region master赋值 FLOW_FLOWRECORDMASTER_T master = new FLOW_FLOWRECORDMASTER_T(); master.INSTANCEID = instance.InstanceId.ToString(); master.BUSINESSOBJECT = submitData.XML; master.FORMID = submitData.FormID; master.MODELCODE = submitData.ModelCode; master.ACTIVEROLE = Utility.GetActiveRlue(flowDefine.LAYOUT); master.FLOWTYPE = ((int)submitData.FlowType).ToString(); master.FLOWSELECTTYPE = ((int)submitData.FlowSelectType).ToString(); master.FLOWCODE = flowDefine.FLOWCODE; #endregion #region 获取下一状态数据 user.TrackingMessage += "FORMID=" + user.FormID + "获取下一状态数据(开始)"; GetUserByFlow2(submitData.ApprovalUser.CompanyID, flowDefine.XOML, flowDefine.RULES, master.ACTIVEROLE, submitData.XML, submitData.ApprovalUser.UserID, submitData.ApprovalUser.PostID, submitData.FlowType, ref dataResult, ref user); LogHelper.WriteLog("FormID=" + user.FormID + " 获取下一状态数据! dataResult.FlowResult=" + dataResult.FlowResult.ToString()); user.TrackingMessage += "FORMID=" + user.FormID + "获取下一状态数据(结束)"; if (dataResult.FlowResult == FlowResult.FAIL) { return dataResult; } submitData.NextStateCode = dataResult.AppState; if (dataResult.IsCountersign) { #region 检查会签是角色是否有审核人员 #region 记录日志 if(submitData.DictCounterUser!=null) { LogHelper.WriteLog("FormID=" + user.FormID + " submitData.DictCounterUser="******"FormID=" + user.FormID + " dataResult.DictCounterUser="******"FormID=" + user.FormID + " submitData.DictCounterUser 会签角色里没有发现有审核人员,所以返回!"); return dataResult; } } else { if (submitData.DictCounterUser == null || submitData.DictCounterUser.Keys.Count == 0) { submitData.DictCounterUser = dataResult.DictCounterUser; } } #endregion } else { #region 检查非会签角色里是否有审核人员 if (dataResult.FlowResult == FlowResult.MULTIUSER) { LogHelper.WriteLog("FormID=" + user.FormID + " 发现有多个审核人员!"); if (submitData.NextApprovalUser == null || (Utility.GetString(submitData.NextApprovalUser.UserID) == "" || Utility.GetString(submitData.NextApprovalUser.UserName) == "")) { LogHelper.WriteLog("FormID=" + user.FormID + " 发现有多个审核人员!但下一审核人为空,所以返回选择审核人!"); return dataResult; } else { LogHelper.WriteLog("FormID=" + user.FormID + " 发现有多个审核人员,但发现下一审核人不为空 usrid="+(Utility.GetString(submitData.NextApprovalUser.UserID)+" 姓名="+Utility.GetString(submitData.NextApprovalUser.UserName))); } } else { if (submitData.DictCounterUser == null || submitData.DictCounterUser.Keys.Count == 0) { submitData.NextApprovalUser = dataResult.UserInfo[0]; } } #endregion } #endregion #region 实体赋值 当提交人为空时,创建人变成单据所属人,如果不为空,则创建人保存为系统登录人;创建公司,部门,岗位,仍然保存单据所属人的公司,部门,岗位 FLOW_FLOWRECORDDETAIL_T entity = new FLOW_FLOWRECORDDETAIL_T(); entity.FLOW_FLOWRECORDMASTER_T = master; entity.CREATECOMPANYID = submitData.ApprovalUser.CompanyID; entity.CREATEDEPARTMENTID = submitData.ApprovalUser.DepartmentID ; entity.CREATEPOSTID = submitData.ApprovalUser.PostID; entity.CREATEUSERID = string.IsNullOrEmpty(submitData.SumbitUserID) ? submitData.ApprovalUser.UserID : submitData.SumbitUserID; entity.CREATEUSERNAME = string.IsNullOrEmpty(submitData.SumbitUserName) ? submitData.ApprovalUser.UserName : submitData.SumbitUserName; #endregion user.TrackingMessage += " 处理kpi时间\r\n"; #region 处理kpi时间 string KPITime = ""; #region 加入缓存 string pscResult = CacheProvider.GetCache<string>(flowRelation.MODELFLOWRELATIONID); if (string.IsNullOrEmpty(pscResult)) { PerformanceServiceWS.PerformanceServiceClient psc = new PerformanceServiceWS.PerformanceServiceClient(); pscResult = psc.GetKPIPointsByBusinessCode(flowRelation.MODELFLOWRELATIONID);//调用服务 CacheProvider.Add<string>(flowRelation.MODELFLOWRELATIONID, pscResult); psc.Close(); } #endregion //PerformanceServiceWS.PerformanceServiceClient psc = new PerformanceServiceWS.PerformanceServiceClient(); //string pscResult = psc.GetKPIPointsByBusinessCode(flowRelation.MODELFLOWRELATIONID);//调用服务 //psc.Close(); if (!string.IsNullOrEmpty(pscResult)) { XElement xe = XElement.Parse(pscResult); Func<XElement, bool> f = (x) => { XAttribute xid = x.Attribute("id"); XAttribute xvalue = x.Attribute("value"); if (xid == null || xvalue == null) return false; else { if (xid.Value == dataResult.AppState) return true; else return false; } }; XElement FlowNode = xe.Elements("FlowNode").FirstOrDefault(f); if (FlowNode != null) { KPITime = FlowNode.Attribute("value").Value; } } dataResult.KPITime = KPITime; master.KPITIMEXML = pscResult; #endregion user.TrackingMessage += " 处理kpi时间完成\r\n"; FlowDataType.FlowData FlowData = new FlowDataType.FlowData(); FlowData.xml = submitData.XML; if (!dataResult.IsCountersign) { #region 确定非会签的下一个审核人 UserInfo AppUser = new UserInfo(); //下一审核人 AppUser = submitData.NextApprovalUser; dataResult.UserInfo.Clear(); dataResult.UserInfo.Add(AppUser); UserInfo AgentAppUser = GetAgentUserInfo(submitData.ModelCode, AppUser.UserID);//查询是否启用了代理人 dataResult = DoFlowRecord2(con, workflowRuntime, instance, entity, submitData.NextStateCode, AppUser, AgentAppUser, submitData.SubmitFlag, submitData.FlowType,ref user); //处理流程数据 dataResult.IsCountersign = false; dataResult.AgentUserInfo = AgentAppUser; #endregion } else { user.TrackingMessage += " 会签\r\n"; #region 确定会签角色里的审核人员 //Tracer.Debug("-----DoFlowRecord_Add:" + DateTime.Now.ToString()+"\n"); dataResult.DictCounterUser = submitData.DictCounterUser; Dictionary<UserInfo, UserInfo> dictAgentUserInfo = GetAgentUserInfo2(submitData.ModelCode, submitData.DictCounterUser); dataResult = DoFlowRecord_Add(con, workflowRuntime, instance, entity, submitData.NextStateCode, submitData.DictCounterUser, dictAgentUserInfo, submitData.SubmitFlag, submitData.FlowType); //处理流程数据 //Tracer.Debug("-----DoFlowRecord_AddEnd:" + DateTime.Now.ToString()+"\n"); dataResult.IsCountersign = true; dataResult.DictAgentUserInfo = dictAgentUserInfo; #endregion user.TrackingMessage += "会签完成\r\n"; } user.TrackingMessage += "激发流程引擎执行到一下流程\r\n"; #region 激发流程引擎执行到一下流程 string ss = ""; int n = 0; StateMachineWorkflowInstance workflowinstance = new StateMachineWorkflowInstance(workflowRuntime, instance.InstanceId); ManualWorkflowSchedulerService scheduleService = workflowRuntime.GetService(typeof(ManualWorkflowSchedulerService)) as ManualWorkflowSchedulerService; if (dataResult.AppState == null || dataResult.AppState == "") { user.TrackingMessage += " workflowRuntime.GetService<FlowEvent>()\r\n"; scheduleService.RunWorkflow(workflowinstance.InstanceId); workflowRuntime.GetService<FlowEvent>().OnDoFlow(instance.InstanceId, FlowData); //激发流程引擎执行到一下流程 scheduleService.RunWorkflow(workflowinstance.InstanceId); user.TrackingMessage += " workflowRuntime.GetService<FlowEvent>()完成\r\n"; } else { scheduleService.RunWorkflow(workflowinstance.InstanceId); workflowinstance.SetState(dataResult.AppState); //流程跳转到指定节点 } #endregion user.TrackingMessage += "激发流程引擎执行到一下流程完成\r\n"; user.TrackingMessage += "System.Threading.Thread.Sleep(1000)\r\n"; //System.Threading.Thread.Sleep(1000);//当前用到 dataResult.ModelFlowRelationID = flowRelation.MODELFLOWRELATIONID; //返回关联ID dataResult.KPITime = KPITime; //dataResult.CanSendMessage = true; if (submitData.FlowType == FlowType.Task) { dataResult.SubModelCode = Utility.GetSubModelCode(master.ACTIVEROLE, dataResult.AppState); //返回下一子模块代码 } user.TrackingMessage += "System.Threading.Thread.Sleep(1000)完成\r\n"; return dataResult; } catch (Exception e) { user.ErrorMsg += "新增流程出错 FormID=" + user.FormID + " CompayName=" + user.CompayName + "FlowName=" + user.FlowName + "异常信息:\r\n" + e.ToString() + "\r\n"; LogHelper.WriteLog("FormID=" + user.FormID + " CompayName=" + user.CompayName + "FlowName=" + user.FlowName + " 新增流程出错,异常信息:\r\n" + e.ToString()); throw new Exception("FormID=" + user.FormID+" 时间:"+DateTime.Now.ToString()+" 新增流程出错,请联系管理员! "); } finally { instance = null; SMTWorkFlowManage.ColseWorkFlowRuntime(workflowRuntime); } }