Example #1
0
        /// <summary>
        /// 工单用户审核
        /// </summary>
        /// <param name="condtion">审批请求</param>
        /// <param name="userInfo">审批用户信息</param>
        public void DoWorkFlowUserConfirm(BaseWorkOrderUserConfirmReqeust condtion, ICommunicationable userInfo)
        {
            //权限验证
            var    nowTaskUsers = GetTaskUsersByStepId(this.WorkFlowBookMarkId);
            string userId       = userInfo.getIdString();
            var    stepInfo     = WorkFlowDefStep.GetInstance(this.WorkFlowBookMarkId);

            if (DoWorkFlowUserConfirmBefore(condtion, nowTaskUsers, userInfo, stepInfo))
            {
                var taskUserInfo = nowTaskUsers.Single(p => p.UserId == userId);
                taskUserInfo.IsConfirm         = true;
                taskUserInfo.ConfirmTime       = DateTime.Now;
                taskUserInfo.ConfirmTimeString = taskUserInfo.ConfirmTime.Value.ToString("yyyy-MM-dd HH:mm");
                taskUserInfo.Remark            = condtion.Remark;
                taskUserInfo.SaveConfirm();
                string msg = string.Format("工作流用户审批,步骤:[{0}],备注:[{1}]", stepInfo.name, condtion.Remark);
                UserLog.create(msg, "工作流", userInfo, this);

                //执行下一步
                var next = stepInfo.GetNextLineDetails();
                DoWorkFlowUserConfirmAfter(condtion, nowTaskUsers, taskUserInfo, stepInfo, next, userInfo);
            }
            else
            {
                throw new ValiDataException("用户审批前置验证失败,无法进行审批");
            }

            if (!nowTaskUsers.Select(p => p.UserId).Contains(userId))
            {
                throw new ValiDataException("您没有审批该流程的权限");
            }
        }
Example #2
0
 /// <summary>
 /// 工作流提交
 /// </summary>
 /// <param name="defId">工作流定义的ID</param>
 /// <param name="user">提交工作流的用户</param>
 public void WorkFlowBegin(string defId, ICommunicationable user)
 {
     if (this.OrderStatus == WorkOrderStatus.待提交 || this.OrderStatus == WorkOrderStatus.已终止)
     {
         DoWorkFlowBegin(defId, user);
     }
     else
     {
         throw new ValiDataException("只有待提交或者已终止的的工单才可进行提交操作");
     }
 }
Example #3
0
 /// <summary>
 /// 管理员无条件直接终止工作流
 /// </summary>
 /// <param name="user"></param>
 /// <param name="condtion"></param>
 /// <returns></returns>
 public BaseWorkOrder WorkFlowTerminationForAdmin(ICommunicationable user, BaseWorkOrderUserConfirmReqeust condtion)
 {
     if (this.OrderStatus == WorkOrderStatus.执行中)
     {
         var result = DoWorkFlowTermination(user, condtion.Remark);
         //记录到日志
         UserLog.create("流程被管理员直接终止", "工作流", user, this);
         return(result);
     }
     else
     {
         throw new ValiDataException("只有执行中的工单才可进行终止操作");
     }
 }
Example #4
0
 /// <summary>
 /// 执行工作流终止操作
 /// </summary>
 /// <returns></returns>
 protected BaseWorkOrder DoWorkFlowTermination(ICommunicationable user, string remark)
 {
     using (var db = new DefaultContainer())
     {
         var row = db.Db_BaseWorkOrderSet.Single(p => p.Id == this.Id);
         row.OrderStatus        = (byte)WorkOrderStatus.已终止.GetHashCode();
         row.WorkFlowBookMarkId = null;
         var tu = row.Db_BaseWorkOrderTaskUser.FirstOrDefault(p => p.UserId == user.getIdString());
         if (tu != null)
         {
             tu.IsConfirm   = true;
             tu.ConfirmTime = DateTime.Now;
             tu.Remark      = remark;
         }
         db.SaveChanges();
         return(new BaseWorkOrder(row));
     }
 }
Example #5
0
        /// <summary>
        /// 执行工作流提交
        /// </summary>
        /// <param name="defId">工作流定义的ID</param>
        /// <param name="user">提交工作流的用户</param>
        protected virtual void DoWorkFlowBegin(string defId, ICommunicationable user)
        {
            this.WorkFlowDefinitionId = defId;

            if (!DoWorkFlowBeginBefore(defId, user))
            {
                throw new ValiDataException("当前工作流无法启动");
            }

            var defInfo = WorkFlowDefinition.GetInstance(defId);

            //获取启动步骤
            defInfo.SetUnits();//获取流程信息
            var beginStep = defInfo.GetBegin();

            if (beginStep == null)
            {
                throw new ValiDataException(string.Format("工作流[{0}]没有起点,无法启动", defInfo.Caption));
            }

            //修改工单状态
            using (var db = new DefaultContainer())
            {
                var row = db.Db_BaseWorkOrderSet.Single(p => p.Id == this.Id);
                row.WorkFlowDefinitionId = defId;
                row.OrderStatus          = (byte)WorkOrderStatus.执行中.GetHashCode();
                db.SaveChanges();
            }

            //记录到日志
            UserLog.create(string.Format("启动工作流,执行流程[{0}]", defInfo.Caption), "工作流", user, this);

            //执行
            //获取下一步
            var nextList = beginStep.GetNextLineDetails();

            if (nextList.Count > 0)
            {
                DoWorkFlowConfim(nextList.First());
            }

            DoWorkFlowBeginAfter(defId, user);
        }
Example #6
0
 /// <summary>
 /// 工作流终止(停止流程执行并设置为终止状态)
 /// </summary>
 public BaseWorkOrder WorkFlowTermination(ICommunicationable user, BaseWorkOrderUserConfirmReqeust condtion)
 {
     if (this.OrderStatus == WorkOrderStatus.执行中)
     {
         var    nowTaskUsers = GetTaskUsersByStepId(this.WorkFlowBookMarkId);
         var    stepInfo     = WorkFlowDefStep.GetInstance(this.WorkFlowBookMarkId);
         string userId       = user.getIdString();
         if (!DoWorkFlowTerminationBefore(condtion, nowTaskUsers, user, stepInfo))
         {
             throw new ValiDataException("该流程不能被终止");
         }
         var taskUserInfo = nowTaskUsers.Single(p => p.UserId == userId);
         var result       = DoWorkFlowTermination(user, condtion.Remark);
         //记录到日志
         UserLog.create(string.Format("流程被终止,原因:[{0}]", condtion.Remark), "工作流", user, this);
         //后续操作
         DoWorkFlowTerminationAfter(condtion, nowTaskUsers, taskUserInfo, stepInfo, user);
         return(result);
     }
     else
     {
         throw new ValiDataException("只有执行中的工单才可进行终止操作");
     }
 }
Example #7
0
 /// <summary>
 /// 【具体业务根据需要重写】执行工作流终止操作后 - 默认什么也没做
 /// </summary>
 /// <param name="condtion">审批请求</param>
 /// <param name="nowTaskUsers">步骤全部审批人</param>
 /// <param name="taskUserInfo">步骤当前审批人</param>
 /// <param name="stepInfo">步骤信息</param>
 /// <param name="userInfo">当前步骤审批人的其他信息</param>
 protected virtual void DoWorkFlowTerminationAfter(BaseWorkOrderUserConfirmReqeust condtion, List <BaseWorkOrderTaskUserInfo> nowTaskUsers, BaseWorkOrderTaskUserInfo taskUserInfo, WorkFlowDefStep stepInfo, ICommunicationable userInfo)
 {
     return;
 }
Example #8
0
 /// <summary>
 /// 【具体业务根据需要重写】执行工作流终止操作前 - 默认为验证用户是否有审批权限
 /// </summary>
 /// <param name="condtion">审批请求</param>
 /// <param name="nowTaskUsers">当前步骤审批人列表</param>
 /// <param name="userInfo">当前审批人</param>
 /// <param name="stepInfo">步骤信息</param>
 /// <returns></returns>
 protected virtual bool DoWorkFlowTerminationBefore(BaseWorkOrderUserConfirmReqeust condtion, List <BaseWorkOrderTaskUserInfo> nowTaskUsers, ICommunicationable userInfo, WorkFlowDefStep stepInfo)
 {
     if (this.OrderStatus == WorkOrderStatus.执行中)
     {
         string userId = userInfo.getIdString();
         if (!nowTaskUsers.Select(p => p.UserId).Contains(userId))
         {
             throw new ValiDataException("您没有终止该流程的权限");
         }
         if (nowTaskUsers.Where(p => !p.IsConfirm).Select(p => p.UserId).Contains(userId))
         {
             return(true);
         }
         else
         {
             throw new ValiDataException("您已经审批过了,不能再终止该流程");
         }
     }
     else
     {
         throw new ValiDataException("当前工作流不是执行中的状态,不能终止");
     }
 }
Example #9
0
 /// <summary>
 /// 【具体业务根据需要重写】工单用户审批后 - 默认为判断是否会签 并执行下一步
 /// </summary>
 /// <param name="condtion">审批请求</param>
 /// <param name="nowTaskUsers">步骤全部审批人</param>
 /// <param name="taskUserInfo">步骤当前审批人</param>
 /// <param name="stepInfo">步骤信息</param>
 /// <param name="nextLines">步骤的下一步信息</param>
 /// <param name="userInfo">当前步骤审批人的其他信息</param>
 protected virtual void DoWorkFlowUserConfirmAfter(BaseWorkOrderUserConfirmReqeust condtion, List <BaseWorkOrderTaskUserInfo> nowTaskUsers, BaseWorkOrderTaskUserInfo taskUserInfo, WorkFlowDefStep stepInfo, List <WorkFlowDefLineDetail> nextLines, ICommunicationable userInfo)
 {
     if (nextLines.Count > 0)
     {
         if (!stepInfo.IsCountersign)
         {
             UserLog.create("非会签任务节点,开始执行下一步", "工作流", adminUser, this);
             //不是会签执行下一步
             DoWorkFlowConfim(nextLines.First());
         }
         else
         {
             //是会签
             //判断是否都已经审批过了 如果是 执行下一步
             if (!nowTaskUsers.Any(p => p.IsConfirm == false))
             {
                 UserLog.create("会签节点,全部用户完成审批,开始执行下一步", "工作流", adminUser, this);
                 DoWorkFlowConfim(nextLines.First());
             }
             else
             {
                 UserLog.create("会签节点,等待其他用户审批", "工作流", adminUser, this);
             }
         }
     }
 }
Example #10
0
 /// <summary>
 /// 【具体业务根据需要重写】工作流启动后 - 一般用户发送通知 默认什么也没干
 /// </summary>
 /// <param name="defId">工作流定义的ID</param>
 /// <param name="user">提交工作流的用户</param>
 protected virtual void DoWorkFlowBeginAfter(string defId, ICommunicationable user)
 {
     return;
 }
Example #11
0
 /// <summary>
 /// 【具体业务根据需要重写】工作流启动前 - 一般用于 验证
 /// </summary>
 /// <param name="defId">工作流定义的ID</param>
 /// <param name="user">提交工作流的用户</param>
 /// <returns></returns>
 protected virtual bool DoWorkFlowBeginBefore(string defId, ICommunicationable user)
 {
     return(true);
 }
Example #12
0
 /// <summary>
 /// 终止后
 /// </summary>
 /// <param name="condtion"></param>
 /// <param name="nowTaskUsers"></param>
 /// <param name="taskUserInfo"></param>
 /// <param name="stepInfo"></param>
 /// <param name="userInfo"></param>
 protected override void DoWorkFlowTerminationAfter(BaseWorkOrderUserConfirmReqeust condtion, List <BaseWorkOrderTaskUserInfo> nowTaskUsers, BaseWorkOrderTaskUserInfo taskUserInfo, WorkFlowDefStep stepInfo, ICommunicationable userInfo)
 {
     UserLog.create("【自定义】请假申请已经被终止", "请假申请", userInfo, this);
     base.DoWorkFlowTerminationAfter(condtion, nowTaskUsers, taskUserInfo, stepInfo, userInfo);
 }
Example #13
0
 /// <summary>
 /// 终止前
 /// </summary>
 /// <param name="condtion"></param>
 /// <param name="nowTaskUsers"></param>
 /// <param name="userInfo"></param>
 /// <param name="stepInfo"></param>
 /// <returns></returns>
 protected override bool DoWorkFlowTerminationBefore(BaseWorkOrderUserConfirmReqeust condtion, List <BaseWorkOrderTaskUserInfo> nowTaskUsers, ICommunicationable userInfo, WorkFlowDefStep stepInfo)
 {
     UserLog.create("【自定义】请假申请审批即将被终止", "请假申请", userInfo, this);
     return(base.DoWorkFlowTerminationBefore(condtion, nowTaskUsers, userInfo, stepInfo));
 }
Example #14
0
 /// <summary>
 /// 用户审批后
 /// </summary>
 /// <param name="condtion">审批请求</param>
 /// <param name="nowTaskUsers">当前审批的用户列表</param>
 /// <param name="taskUserInfo">当前审批人</param>
 /// <param name="stepInfo">当前步骤</param>
 /// <param name="nextLines">后续可选步骤</param>
 /// <param name="userInfo">审批人</param>
 protected override void DoWorkFlowUserConfirmAfter(BaseWorkOrderUserConfirmReqeust condtion, List <BaseWorkOrderTaskUserInfo> nowTaskUsers, BaseWorkOrderTaskUserInfo taskUserInfo, WorkFlowDefStep stepInfo, List <WorkFlowDefLineDetail> nextLines, ICommunicationable userInfo)
 {
     UserLog.create("【自定义】请假申请用户已审批", "请假申请", userInfo, this);
     base.DoWorkFlowUserConfirmAfter(condtion, nowTaskUsers, taskUserInfo, stepInfo, nextLines, userInfo);
 }
Example #15
0
        /// <summary>
        /// 工作流启动后
        /// </summary>
        /// <param name="defId"></param>
        /// <param name="user"></param>

        protected override void DoWorkFlowBeginAfter(string defId, ICommunicationable user)
        {
            UserLog.create("【自定义】请假申请工作流已启动完毕", "请假申请", user, this);
            base.DoWorkFlowBeginAfter(defId, user);
        }
Example #16
0
 /// <summary>
 /// 工作流启动前
 /// </summary>
 /// <param name="defId"></param>
 /// <param name="user"></param>
 /// <returns></returns>
 protected override bool DoWorkFlowBeginBefore(string defId, ICommunicationable user)
 {
     UserLog.create("【自定义】请假申请工作流即将启动", "请假申请", user, this);
     return(base.DoWorkFlowBeginBefore(defId, user));
 }