/// <summary>
        /// 设定处理者实例正常结束
        /// </summary>
        /// <param name="userInfo">用户</param>
        /// <param name="userId">用户Id</param>
        /// <param name="operatorInsId">操作者实例id</param>
        /// <returns>大于0成功</returns>
        public int SetOperatorInstanceOver(UserInfo userInfo, string userId, string operatorInsId)
        {
            int returnValue = -1;
            var parameter   = ParameterUtil.CreateWithMessage(userInfo, MethodBase.GetCurrentMethod(), this.serviceName, RDIFrameworkMessage.WorkFlowInstanceService_SetOperatorInstanceOver);

            ServiceUtil.ProcessWorkFlowDbWithTransaction(userInfo, parameter, dbProvider =>
            {
                var manager = new OperatorInstanceManager(dbProvider, userInfo);
                returnValue = manager.SetOperatorInstanceOver(userId, operatorInsId);
            });
            return(returnValue);
        }
        /// <summary>
        /// 获得一个要处理的信息
        /// </summary>
        /// <param name="userInfo">用户</param>
        /// <param name="operatorInsId">处理者实例Id</param>
        /// <returns></returns>
        public DataTable GetOperatorInstance(UserInfo userInfo, string operatorInsId)
        {
            var parameter = ParameterUtil.CreateWithMessage(userInfo, MethodBase.GetCurrentMethod(), this.serviceName, RDIFrameworkMessage.WorkFlowInstanceService_GetOperatorInstance);
            var dataTable = new DataTable(OperatorInstanceTable.TableName);

            ServiceUtil.ProcessWorkFlowDb(userInfo, parameter, dbProvider =>
            {
                var manager = new OperatorInstanceManager(dbProvider, userInfo);
                dataTable   = manager.GetOperatorInstance(operatorInsId);
            });
            return(dataTable);
        }
        /// <summary>
        /// 创建处理者实例
        /// </summary>
        /// <param name="userInfo">用户</param>
        /// <param name="entity">创建处理者实例实体</param>
        /// <returns>主键</returns>
        public string CreateOperatorInstance(UserInfo userInfo, OperatorInstanceEntity entity)
        {
            string returnValue = string.Empty;
            var    parameter   = ParameterUtil.CreateWithMessage(userInfo, MethodBase.GetCurrentMethod(), this.serviceName, RDIFrameworkMessage.WorkFlowInstanceService_CreateOperatorInstance);

            ServiceUtil.ProcessWorkFlowDbWithTransaction(userInfo, parameter, dbProvider =>
            {
                var manager = new OperatorInstanceManager(dbProvider, userInfo);
                // 调用方法,并且返回运行结果
                returnValue = manager.Create(entity);
            });
            return(returnValue);
        }
        /// <summary>
        /// 任务任意退回
        /// </summary>
        /// <param name="userId">用户id</param>
        /// <param name="operatorInsId">退回的处理实例Id</param>
        /// <param name="backyy">退回原因</param>
        /// <param name="workflowInsId">上级</param>
        /// <returns></returns>
        public string WorkTaskBackry(string userId, string operatorInsId, string backyy, string workflowInsId)
        {
            try
            {
                //1、存储过程方法

                /*
                 * int i = this.DBProvider.ExecuteProcedure("WorkTaskSubmitBackProry", new IDbDataParameter[]
                 * {
                 *  DBProvider.MakeParameter("OPERATORINSTANCEID", operatorInsId),
                 *  DBProvider.MakeParameter("BACKYY", backyy),
                 *  DBProvider.MakeParameter("WORKFLOWINSID", workflowInsId),
                 *  DBProvider.MakeParameter("USERID", userId)
                 * });
                 * return (i > 0) ? WorkFlowConst.SuccessCode : WorkFlowConst.TaskAssignErrorCode;
                 */
                //2、直接语句法
                int returnValue = 0;

                //2.1、取得处理的任务实例
                string workTaskInsId = new OperatorInstanceManager(DBProvider).GetProperty(OperatorInstanceTable.FieldOperatorInsId, operatorInsId, OperatorInstanceTable.FieldWorkTaskInsId);
                //2.2、获取前一任务实例
                string workFlow = new WorkTaskInstanceManager(DBProvider).GetProperty(WorkTaskInstanceTable.FieldWorkTaskInsId, workTaskInsId, WorkTaskInstanceTable.FieldWorkFlowInsId);

                //2.3、设定当前任务结束
                //SetWorkTaskInstanceOver(userId, workTaskInsId);
                SetWorkTaskInstanceOver(GetUserRealNameById(userId), workTaskInsId);

                //2.4、设置当前处理者实例结束
                returnValue += new OperatorInstanceManager(DBProvider).SetOperatorInstanceOver(userId, operatorInsId);
                //2.5、
                string strSql = string.Format(@"
                                        INSERT  INTO WORKFLOWBACK(ID, USERID ,OPERATORINSID ,BACKYY , BACKTIME)
                                        VALUES  ( {0} ,{1} ,{2} ,{3},{4} )",
                                              DBProvider.GetParameter("ID"),
                                              DBProvider.GetParameter("USERID"),
                                              DBProvider.GetParameter("OPERATORINSID"),
                                              DBProvider.GetParameter("BACKYY"),
                                              DBProvider.GetDBNow());
                returnValue += DBProvider.ExecuteNonQuery(strSql, new[] {
                    DBProvider.MakeParameter("ID", BusinessLogic.NewGuid()),
                    DBProvider.MakeParameter("USERID", GetUserRealNameById(userId)),
                    DBProvider.MakeParameter("OPERATORINSID", workFlow),
                    DBProvider.MakeParameter("BACKYY", backyy)
                });
                //2.6、
                strSql = string.Format(@"
                                        INSERT  INTO AUDITMESSAGE
                                                ( AUDITID,WORKFLOWINSID ,MESSAGE ,AUDITUSERID ,AUDITUSERNAME ,AUDITRESULT ,AUDITTIME ,AUDITXYB)
                                        VALUES  ( {0} ,{1} ,{2} ,{3} ,{4} ,{5} ,{6},{7})",
                                       DBProvider.GetParameter("AUDITID"),
                                       DBProvider.GetParameter("WORKFLOWINSID"),
                                       DBProvider.GetParameter("MESSAGE"),
                                       DBProvider.GetParameter("AUDITUSERID"),
                                       DBProvider.GetParameter("USERID"),
                                       "'任意退回'",
                                       DBProvider.GetDBNow(),
                                       0);
                returnValue += DBProvider.ExecuteNonQuery(strSql, new[] {
                    DBProvider.MakeParameter("AUDITID", BusinessLogic.NewGuid()),
                    DBProvider.MakeParameter("WORKFLOWINSID", workFlow),
                    DBProvider.MakeParameter("MESSAGE", backyy),
                    DBProvider.MakeParameter("AUDITUSERID", userId),
                    DBProvider.MakeParameter("USERID", GetUserRealNameById(userId))
                });
                //2.7、退回至提交人 此处与WORKFLOWCONST.TASKBACKMSG对应
                //UPDATE  WORKTASKINSTANCE  SET  SUCCESSMSG = '任意退回至提交人!'   WHERE   WORKTASKINSID = @WORKTASKINSID
                returnValue += SetProperty(WorkTaskInstanceTable.FieldWorkTaskInsId, workTaskInsId, WorkTaskInstanceTable.FieldSuccessMsg, "任意退回至提交人!");

                //2.8、任务状态重置
                switch (DBProvider.CurrentDbType)
                {
                case CurrentDbType.Access:
                case CurrentDbType.SqlServer:
                    strSql = string.Format(@"
                                        UPDATE  WORKTASKINSTANCE
                                        SET     ENDTIME = {0} ,STATUS = '2' ,REMINDED = '0' ,OPERATEDDES = ISNULL(OPERATEDDES, '') + ',但被[' + {1} + ']任意退回,'
                                        WHERE   WORKTASKINSID = {2}  AND STATUS = 3",
                                           DBProvider.GetDBNow(),
                                           DBProvider.GetParameter("USERID"),
                                           DBProvider.GetParameter("WORKTASKINSID"));
                    break;

                case CurrentDbType.Oracle:
                    strSql = string.Format(@"
                                        UPDATE  WORKTASKINSTANCE
                                        SET     ENDTIME = {0} ,STATUS = '2' ,REMINDED = '0' ,OPERATEDDES = NVL(OPERATEDDES, '') + ',但被[' + {1} + ']任意退回,'
                                        WHERE   WORKTASKINSID = {2}  AND STATUS = 3",
                                           DBProvider.GetDBNow(),
                                           DBProvider.GetParameter("USERID"),
                                           DBProvider.GetParameter("WORKTASKINSID"));
                    break;

                case CurrentDbType.MySql:
                    strSql = string.Format(@"
                                        UPDATE  WORKTASKINSTANCE
                                        SET     ENDTIME = {0} ,STATUS = '2' ,REMINDED = '0' ,OPERATEDDES = CONCAT(IFNULL(OPERATEDDES, '') ,',但被[',{1},']任意退回,')
                                        WHERE   WORKTASKINSID = {2}  AND STATUS = 3",
                                           DBProvider.GetDBNow(),
                                           DBProvider.GetParameter("USERID"),
                                           DBProvider.GetParameter("WORKTASKINSID"));
                    break;
                }
                returnValue += DBProvider.ExecuteNonQuery(strSql, new[] {
                    DBProvider.MakeParameter("USERID", GetUserRealNameById(userId)),
                    DBProvider.MakeParameter("WORKTASKINSID", workflowInsId)
                });
                return((returnValue > 0) ? WorkFlowConst.SuccessCode : WorkFlowConst.TaskAssignErrorCode);
            }
            catch (Exception ex)
            {
                //LogHelper.WriteLog(ex);
                throw new Exception("BizLogicError:任务退回失败,请与管理员联系!Error:" + ex.Message);
            }
        }
        /// <summary>
        /// 认领任务
        /// </summary>
        /// <param name="userId">用户Id</param>
        /// <param name="operatorInsId">认领的任务Id</param>
        /// <returns></returns>
        public string WorkTaskClaim(string userId, string operatorInsId)
        {
            try
            {
                //1、存储过程方式

                /*
                 * int i = DBProvider.ExecuteProcedure("WorkTaskClaimPro", new[]
                 * {
                 *  DBProvider.MakeParameter("USERID", userId),
                 *  DBProvider.MakeParameter("OPERATORINSTANCEID", operatorInsId)
                 *
                 * });
                 *
                 * return (i > 0) ? WorkFlowConst.SuccessCode : WorkFlowConst.TaskClaimErrorCode;
                 */
                //2、语句方式
                //2.1、取得处理的任务实例
                string workTaskInstanceId = new OperatorInstanceManager(DBProvider).GetProperty(OperatorInstanceTable.FieldOperatorInsId, operatorInsId, OperatorInstanceTable.FieldWorkTaskInsId);

                //2.2、检查是否具有认领权限
                string strSql = string.Format(@"SELECT  COUNT(*)
                                                FROM    ( SELECT    OPERCONTENT ,
                                                                    STATUS ,
                                                                    USERID ,
                                                                    OPERATORINSID ,
                                                                    OPERSTATUS
                                                            FROM      WORKTASKINSTANCEVIEW
                                                            WHERE     ( ( OPERCONTENT IN ( SELECT OPERCONTENT
                                                                                            FROM   OPERCONTENTVIEW
                                                                                            WHERE  USERID = {0} ) )
                                                                        OR ( OPERCONTENT = 'All' )
                                                                    )
                                                                    AND ( OPERSTATUS = '0' )
                                                                    AND ( STATUS = '1' )
                                                                    AND OPERATORINSID = {1}
                                                            UNION
                                                            SELECT    OPERCONTENT ,
                                                                    STATUS ,
                                                                    USERID ,
                                                                    OPERATORINSID ,
                                                                    OPERSTATUS
                                                            FROM      WORKTASKINSACCREDITVIEW
                                                            WHERE     ACCREDITTOUSERID = {2}
                                                                    AND ACCREDITSTATUS = '1'
                                                                    AND STATUS = '1'
                                                        ) A", DBProvider.GetParameter("USERID"), DBProvider.GetParameter("OPERATORINSID"), DBProvider.GetParameter("ACCREDITTOUSERID"));
                int    jg     = BusinessLogic.ConvertToInt(DBProvider.ExecuteScalar(strSql, new[] { DBProvider.MakeParameter("USERID", userId), DBProvider.MakeParameter("OPERATORINSID", operatorInsId), DBProvider.MakeParameter("ACCREDITTOUSERID", userId) }));

                if (jg < 1)
                {
                    throw new Exception("BizLogicError:认领任务失败,请与管理员联系");
                }

                //2.3、设置任务实例被那个处理者认领
                strSql = string.Format(@"UPDATE  WORKTASKINSTANCE
                                        SET     STATUS = 2 ,
                                                OPERATORINSID = {0}
                                        WHERE   WORKTASKINSID = {1}
                                                AND STATUS = '1'", DBProvider.GetParameter("OPERATORINSID"), DBProvider.GetParameter("WORKTASKINSID"));
                int returnValue = DBProvider.ExecuteNonQuery(strSql, new[] { DBProvider.MakeParameter("OPERATORINSID", operatorInsId), DBProvider.MakeParameter("WORKTASKINSID", workTaskInstanceId) });

                //2.4、设置处理者实例已认领
                strSql       = string.Format(@"UPDATE  OPERATORINSTANCE
                                        SET     USERID = {0} ,
                                                OPERSTATUS = '3'
                                        WHERE   OPERATORINSID = {1}
                                                AND OPERSTATUS = '0'", DBProvider.GetParameter("USERID"), DBProvider.GetParameter("OPERATORINSID"));
                returnValue += DBProvider.ExecuteNonQuery(strSql, new[] { DBProvider.MakeParameter("USERID", userId), DBProvider.MakeParameter("OPERATORINSID", operatorInsId) });
                return((returnValue > 0) ? WorkFlowConst.SuccessCode : WorkFlowConst.TaskClaimErrorCode);
            }
            catch (Exception ex)
            {
                throw new Exception("BizLogicError:认领任务失败,请与管理员联系!Error:" + ex.Message);
            }
        }
Ejemplo n.º 6
0
        /// <summary>
        /// 指定处理人
        /// </summary>
        /// <param name="userId">用户Id</param>
        /// <param name="workFlowId">流程模板Id</param>
        /// <param name="workTaskId">任务模板Id</param>
        /// <param name="workFlowInstanceId">流程实例Id</param>
        /// <param name="workTaskInstanceId">任务实例Id</param>
        /// <param name="operParam">处理者参数</param>
        /// <returns>是否成功</returns>
        public bool AssignUser(string userId, string workFlowId, string workTaskId, string workFlowInstanceId, string workTaskInstanceId, OperParameter operParam)
        {
            if (string.IsNullOrEmpty(operParam.OperContent))
            {
                return(false);
            }

            switch (operParam.OperRule)
            {
            case "1":
            {
                //创建处理人实例
                var operInsEntity = new OperatorInstanceEntity()
                {
                    OperatorInsId   = BusinessLogic.NewGuid(),
                    WorkFlowId      = workFlowId,
                    WorkTaskId      = workTaskId,
                    WorkFlowInsId   = workFlowInstanceId,
                    WorkTaskInsId   = workTaskInstanceId,  //此时是新任务Id
                    UserId          = "",
                    OperRealtion    = operParam.OperRelation,
                    OperContent     = operParam.OperContent,
                    OperContentText = operParam.OperContenText,
                    OperType        = operParam.OperType//此处保留原来的处理类型
                };
                string successCode = new OperatorInstanceManager(this.DBProvider).Create(operInsEntity);

                //给处理者发送信息
                if (!string.IsNullOrEmpty(successCode) && successCode.Length > 0)
                {
                    var messageEntity = new CiMessageEntity
                    {
                        Id           = BusinessLogic.NewGuid(),
                        FunctionCode = MessageFunction.Remind.ToString(),
                        ReceiverId   = DefaultRole.Administrator.ToString(),
                        Title        = "业务流程消息",
                        MSGContent   = "你有一待办任务,请到未认领任务界面认领。",
                        IsNew        = 1,
                        ReadCount    = 0,
                        Enabled      = 1,
                        DeleteMark   = 0
                    };

                    var messageManager = new CiMessageManager(DbFactoryProvider.GetProvider(SystemInfo.RDIFrameworkDbType, SystemInfo.RDIFrameworkDbConectionString), this.UserInfo);
                    messageManager.BatchSend(operInsEntity.OperContent, null, null, messageEntity, false);
                }

                if ((userId == operParam.OperContent) && (operParam.IsJumpSelf))    //处理者是提交人,自动处理
                {
                    var wfrun = new WorkFlowRuntime();
                    wfrun.Run(userId, operInsEntity.OperatorInsId, "提交");
                }
            }
            break;

            case "2":
            {
                //创建任务实例
                var newTaskId         = BusinessLogic.NewGuid();//新任务实例Id
                var workTaskInsEntity = new WorkTaskInstanceEntity()
                {
                    WorkFlowId     = workFlowId,
                    WorkTaskId     = workTaskId,
                    WorkFlowInsId  = workFlowInstanceId,
                    WorkTaskInsId  = newTaskId,
                    PreviousTaskId = workTaskInstanceId,    //此时是当前任务Id
                    TaskInsCaption = new WorkTaskManager(this.DBProvider).GetTaskCaption(workTaskId),
                    Status         = "1",
                };
                new WorkTaskInstanceManager(this.DBProvider).Create(workTaskInsEntity);

                //创建处理人实例
                var operInsEntity = new OperatorInstanceEntity()
                {
                    OperatorInsId   = BusinessLogic.NewGuid(),
                    WorkFlowId      = workFlowId,
                    WorkTaskId      = workTaskId,
                    WorkFlowInsId   = workFlowInstanceId,
                    WorkTaskInsId   = newTaskId,
                    UserId          = "",
                    OperRealtion    = operParam.OperRelation,
                    OperContent     = operParam.OperContent,
                    OperContentText = operParam.OperContenText,
                    OperType        = 3,//此处修改为指定处理人
                };
                string successCode = new OperatorInstanceManager(this.DBProvider).Create(operInsEntity);

                //给处理者发送信息
                if (!string.IsNullOrEmpty(successCode) && successCode.Length > 0)
                {
                    var messageEntity = new CiMessageEntity
                    {
                        Id           = BusinessLogic.NewGuid(),
                        FunctionCode = MessageFunction.Remind.ToString(),
                        ReceiverId   = DefaultRole.Administrator.ToString(),
                        Title        = "业务流程消息",
                        MSGContent   = "你有一待办任务,请到未认领任务界面认领。",
                        IsNew        = 1,
                        ReadCount    = 0,
                        Enabled      = 1,
                        DeleteMark   = 0
                    };

                    var messageManager = new CiMessageManager(DbFactoryProvider.GetProvider(SystemInfo.RDIFrameworkDbType, SystemInfo.RDIFrameworkDbConectionString), this.UserInfo);
                    messageManager.BatchSend(operInsEntity.OperContent, null, null, messageEntity, false);
                }
                if ((userId == operParam.OperContent) && (operParam.IsJumpSelf))    //处理者是提交人,自动处理
                {
                    var wfrun = new WorkFlowRuntime();
                    wfrun.Run(userId, operInsEntity.OperatorInsId, "提交");
                }
            }
            break;
            }
            return(true);
        }