/// <summary> /// 撤销申请单 /// </summary> /// <param name="userInfo">用户、部门、公司对象</param> /// <param name="applyId">申请单ID</param> /// <param name="whyCancel">撤销理由</param> public void CancelApply(LoginUserInfo userInfo, string applyId, string whyCancel) { ApplyInfo applyInfo = BLLFactory <Apply> .Instance.FindByID(applyId); if (applyInfo != null) { applyInfo.Status = ApplyStatus.已撤消; applyInfo.ProcType = (int)ProcType.无处理; applyInfo.ProcUser = ""; applyInfo.WhyCancel = whyCancel; BLLFactory <Apply> .Instance.Update(applyInfo, applyId); //更新申请单状态 BLLFactory <ApplyUser> .Instance.DeleteByApplyId(applyId); //删除当前审批人 #region 撤销的时候,对所有的流程步骤,重置相关的状态 var flowListAll = BLLFactory <ApplyFlow> .Instance.GetAllByApplyId(applyId); foreach (ApplyFlowInfo flowInfo in flowListAll) { BLLFactory <ApplyFlow> .Instance.ResetFlowInfo(flowInfo);//更新状态到初始 } #endregion #region 记录系统和流程操作日志 var content = "用户撤消了该申请单。"; BLLFactory <ApplyLog> .Instance.AddApplyLog(applyId, userInfo.ID.ToInt32(), content); //记录到流程日志 var flowName = "用户撤消"; var flowLogInfo = new ApplyFlowlogInfo(applyId, flowName, userInfo.ID.ToInt32(), whyCancel, applyInfo.ProcType); BLLFactory <ApplyFlowlog> .Instance.Insert(flowLogInfo); #endregion } }
/// <summary> /// 重新创建申请单流程 /// </summary> /// <param name="userInfo">用户、部门、公司对象</param> /// <param name="applyId">申请单ID</param> /// <param name="applyTitle">申请单标题</param> /// <param name="selprocuser">流程处理人</param> /// <param name="remark">备注信息</param> public void ReCreateApplyFlow(LoginUserInfo userInfo, string applyId, string applyTitle, string selprocuser, string remark) { string message = ""; ApplyInfo applyInfo = BLLFactory <Apply> .Instance.FindByID(applyId); if (applyInfo != null) { //更新流程的标题 applyInfo.Status = ApplyStatus.处理中;//重新设置为处理中 applyInfo.Title = applyTitle; applyInfo.Remark = remark; BLLFactory <Apply> .Instance.Update(applyInfo, applyId); //删除原来所有的流程步骤 BLLFactory <ApplyFlow> .Instance.DeleteAllFlow(applyId); #region 添加新的流程,并保存 //获取当前用户相关联的流程,有些给过滤掉了 List <FormFlowInfo> flowList = GetRelatedFlows(userInfo, applyInfo.FormId, applyId); int orderNum = 0; foreach (FormFlowInfo flowInfo in flowList) { orderNum++; #region 申请单流程数据 ApplyFlowInfo appFlowInfo = new ApplyFlowInfo(flowInfo); appFlowInfo.ApplyId = applyId; appFlowInfo.OrderNo = orderNum; #endregion //如果是第一个流程,那么采用传过来的流程处理人 if (orderNum == 1 && !string.IsNullOrEmpty(selprocuser)) { appFlowInfo.ProcUser = selprocuser; } BLLFactory <ApplyFlow> .Instance.Insert(appFlowInfo); } #endregion #region 保存申请单日志 var content = string.Format("创建了该申请单的处理流程,共有{0}个流程环节。", flowList.Count); BLLFactory <BLL.ApplyLog> .Instance.AddApplyLog(applyId, userInfo.ID.ToInt32(), content); //记录到流程日志 var flowName = "重新提交表单"; ApplyFlowlogInfo flowLogInfo = new ApplyFlowlogInfo(applyId, flowName, userInfo.ID.ToInt32(), ""); BLLFactory <ApplyFlowlog> .Instance.Insert(flowLogInfo); #endregion //添加流程处理人 message = "您已经更新了该申请单。"; message += CreateCurrentFlow(userInfo, applyId); } }
/// <summary> /// 在当前流程步骤中添加审批记录 /// </summary> /// <param name="userInfo">用户、部门、公司对象</param> /// <param name="applyId">申请单ID</param> /// <param name="opinion">处理意见</param> private void AddCurrentFlowLog(LoginUserInfo userInfo, string applyId, string opinion) { var flowInfo = BLLFactory <ApplyFlow> .Instance.GetFirstUnHandledFlow(applyId); if (flowInfo != null) { //记录用户处理意见 var logInfo = new ApplyFlowlogInfo(applyId, flowInfo.FlowName, userInfo.ID.ToInt32(), opinion); BLLFactory <ApplyFlowlog> .Instance.Insert(logInfo); } }
/// <summary> /// 根据登录用户、表单ID,对已经存在的申请单,重置流程相关的数据。(记录操作日志) /// 用户可以指定跳回到那个流程点,如果流程ID(atflowId)为空,则跳回到第一个流程点上,并初始化相关数据。 /// </summary> /// <param name="userInfo">用户、部门、公司对象</param> /// <param name="applyId">申请单ID</param> /// <param name="opinion">处理意见</param> /// <param name="atflowId">恢复到的流程ID,如果为空,则表示到第一个流程,否则为具体的流程ID</param> public void ResetApply(LoginUserInfo userInfo, string applyId, string opinion, string atflowId = "") { if (string.IsNullOrEmpty(atflowId)) { //跳回到第一个的时候就实行拒绝操作 string condition = string.Format("apply_id='{0}' ", applyId); var firstFlowInfo = BLLFactory <ApplyFlow> .Instance.FindFirst(condition); if (firstFlowInfo != null) { RefuseApply(userInfo, applyId, firstFlowInfo.ProcUser, opinion, firstFlowInfo.ProcUser); } } else { #region 找出要跳到的流程点下所有的流程并初始化 //对指定的流程步骤,重置相关的状态 var flowInfo = BLLFactory <ApplyFlow> .Instance.FindByID(atflowId); if (flowInfo != null) { BLLFactory <ApplyFlow> .Instance.ResetFlowInfo(flowInfo);//更新状态到初始 } #endregion #region 流程后续处理 var appflowInfo = BLLFactory <ApplyFlow> .Instance.GetFirstUnHandledFlow(applyId); if (appflowInfo != null) { //删除当前审批人,重置申请表的初始化状态,并增加当前审批人和记录日志 InitApplyUserAndLog(userInfo, applyId, appflowInfo); //记录到流程日志 var flowName = string.Format("重置流程,跳转到\"{0}\"", appflowInfo.FlowName); ApplyFlowlogInfo flowLogInfo = new ApplyFlowlogInfo(applyId, flowName, userInfo.ID.ToInt32()); BLLFactory <ApplyFlowlog> .Instance.Insert(flowLogInfo); } #endregion } }
/// <summary> /// 处理当前的流程Approve/Refuse。 /// </summary> /// <param name="userInfo">用户、部门、公司对象</param> /// <param name="applyId">申请单ID</param> /// <param name="msgsendto">发送消息给谁</param> /// <param name="opinion">处理意见</param> /// <param name="is_proc">当前流程是否通过,1为通过,2为拒绝</param> /// <param name="selprocuser">流程处理人</param> private void ProcessApplyFlow(LoginUserInfo userInfo, string applyId, string msgsendto, string opinion, int is_proc, string selprocuser) { ApplyInfo applyInfo = BLLFactory <Apply> .Instance.FindByID(applyId); ApplyFlowInfo flowInfo = BLLFactory <ApplyFlow> .Instance.GetFirstUnHandledFlow(applyId); if (applyInfo != null && flowInfo != null) { #region 计算处理用时 string last_time = applyInfo.ProcTime; if (string.IsNullOrEmpty(last_time)) { last_time = applyInfo.Edittime.ToString("yyyy-MM-dd HH:mm:ss"); } long deltatime = (long)DateTime.Now.Subtract(Convert.ToDateTime(last_time)).TotalSeconds; #endregion int is_auth = BLLFactory <ApplyUser> .Instance.GetCountByApplyIdAndUserId(applyId, userInfo.ID.ToInt32()) > 0 ? 0 : 1; if (applyInfo.ProcType == (int)ProcType.会签) { #region 会签处理 //更新会签记录 BLLFactory <ApplySign> .Instance.UpdateSignInfo(applyId, flowInfo.ID, userInfo.ID.ToInt32(), opinion, is_proc); //判断是否完成会签 var signFinished = BLLFactory <ApplySign> .Instance.IsSignFinished(flowInfo.ID); if (signFinished) { //判断是否全部通过会签 var signPassed = BLLFactory <ApplySign> .Instance.IsSignPassed(flowInfo.ID); //如果全部会签流程处理完毕 var signMessage = signPassed ? "会签通过" : "会签不通过"; flowInfo.ProcTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); //在发起人未审批前,会签不完成 //flowInfo.IsProc = signPassed ? (int)ApplyStatus.已完成 : (int)ApplyStatus.已退回; flowInfo.MsgSendTo = msgsendto; flowInfo.Deltatime = Convert.ToInt32(deltatime); flowInfo.Opinion = signMessage; BLLFactory <ApplyFlow> .Instance.Update(flowInfo, flowInfo.ID); //更新流程状态(审批状态,未处理,让发起人审批是否提交) applyInfo.Status = ApplyStatus.处理中; applyInfo.ProcType = (int)ProcType.审批; BLLFactory <Apply> .Instance.Update(applyInfo, applyId); var applyUserInfo = new ApplyUserInfo(applyId, applyInfo.ProcUser.ToInt32()); BLLFactory <ApplyUser> .Instance.Insert(applyUserInfo); //保存申请单日志(系统流程日志) var content = string.Format("该申请在流程环节[{0}][{1}]。", flowInfo.FlowName, signMessage); BLLFactory <ApplyLog> .Instance.AddApplyLog(applyId, userInfo.ID.ToInt32(), content); } #endregion } //else if(applyInfo.ProcType == (int)ProcType.阅办) //{ // //阅办处理 //} else { #region 更新流程及处理单信息 flowInfo.ProcUid = userInfo.ID.ToInt32(); flowInfo.ProcTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); flowInfo.IsProc = is_proc; flowInfo.MsgSendTo = msgsendto; flowInfo.Deltatime = Convert.ToInt32(deltatime); flowInfo.Opinion = opinion; BLLFactory <ApplyFlow> .Instance.Update(flowInfo, flowInfo.ID); #endregion if (is_proc == (int)ApplyIsProc.拒绝) { #region 拒绝流程 //更新流程状态 applyInfo.Status = ApplyStatus.已退回; applyInfo.ProcType = 0; applyInfo.ProcUser = ""; BLLFactory <Apply> .Instance.Update(applyInfo, applyId); //拒绝流程后,删除申请单的所有流程用户 BLLFactory <ApplyUser> .Instance.DeleteByApplyId(applyId); //保存申请单日志(系统流程日志) string content = string.Format("申请单({0})已经被退回", applyInfo.Title); FormInfo formInfo = BLLFactory <Form> .Instance.FindByID(applyInfo.FormId); if (formInfo != null) { content = string.Format("用户ID为 {0},于 {1} 创建的 {2}({3}) 已经被退回。", applyInfo.Editor, applyInfo.Edittime, formInfo.FormName, applyInfo.Title); } BLLFactory <ApplyLog> .Instance.AddApplyLog(applyId, userInfo.ID.ToInt32(), content); //"您已经退回了该申请。"; #endregion } else { #region 批准流程后续处理 //该申请单的下一处理流程 ApplyFlowInfo nextFlowInfo = BLLFactory <ApplyFlow> .Instance.GetNextUnHandledFlow(applyId, flowInfo.ID); if (nextFlowInfo != null) { selprocuser = selprocuser.Trim(); if (!string.IsNullOrEmpty(selprocuser) && selprocuser != nextFlowInfo.ProcUser) { nextFlowInfo.ProcUser = selprocuser; BLLFactory <ApplyFlow> .Instance.Update(nextFlowInfo, nextFlowInfo.ID); } } //保存申请单日志(系统流程日志) var content = string.Format("在流程环节[{0}]用户批准了申请。", flowInfo.FlowName); BLLFactory <ApplyLog> .Instance.AddApplyLog(applyId, userInfo.ID.ToInt32(), content); #endregion } //更新处理单最后处理时间 applyInfo.ProcTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); BLLFactory <Apply> .Instance.Update(applyInfo, applyId); } #region 记录到流程日志 var flowLogInfo = new ApplyFlowlogInfo(applyId, flowInfo.FlowName, userInfo.ID.ToInt32(), opinion, applyInfo.ProcType); flowLogInfo.FlowId = flowInfo.ID; flowLogInfo.OrderNo = flowInfo.OrderNo; BLLFactory <ApplyFlowlog> .Instance.Insert(flowLogInfo); #endregion } }