/// <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("您没有审批该流程的权限"); } }
/// <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("只有待提交或者已终止的的工单才可进行提交操作"); } }
/// <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("只有执行中的工单才可进行终止操作"); } }
/// <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)); } }
/// <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); }
/// <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("只有执行中的工单才可进行终止操作"); } }
/// <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; }
/// <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("当前工作流不是执行中的状态,不能终止"); } }
/// <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); } } } }
/// <summary> /// 【具体业务根据需要重写】工作流启动后 - 一般用户发送通知 默认什么也没干 /// </summary> /// <param name="defId">工作流定义的ID</param> /// <param name="user">提交工作流的用户</param> protected virtual void DoWorkFlowBeginAfter(string defId, ICommunicationable user) { return; }
/// <summary> /// 【具体业务根据需要重写】工作流启动前 - 一般用于 验证 /// </summary> /// <param name="defId">工作流定义的ID</param> /// <param name="user">提交工作流的用户</param> /// <returns></returns> protected virtual bool DoWorkFlowBeginBefore(string defId, ICommunicationable user) { return(true); }
/// <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); }
/// <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)); }
/// <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); }
/// <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); }
/// <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)); }