/// <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="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> 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> /// <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)); } }