Exemple #1
0
        /// <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);
            }
        }
Exemple #2
0
        /// <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);
            }
        }
Exemple #3
0
        /// <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
            }
        }
Exemple #4
0
        //下一审核人提交审核时调用方法
        /// <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);
            }
        }
Exemple #5
0
        /// <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
        }
Exemple #8
0
        /// <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);
            }
        }
Exemple #10
0
        /// <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);

            }
        }
Exemple #11
0
        /// <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);
            }
        }
Exemple #12
0
        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;
            }
        }
Exemple #13
0
        /// <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;
            }
        }
Exemple #14
0
 /// <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);
     }
 }
Exemple #15
0
        /// <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";

            }
        }
Exemple #18
0
        /// <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);
            }
        }
Exemple #19
0
        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;
        }
Exemple #20
0
        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;
        }
Exemple #22
0
        /// <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);
            }


        }