/// <summary> /// 任务设置终止状态 /// </summary> /// <param name="taskId"></param> /// <param name="runner"></param> internal void End(string taskId, WfAppRunner runner) { WfTask task = _dataAccessor.Get <WfTask>(taskId, false); if (task != null) { task.TaskState = WfTaskState.Ended; task.ApproveState = WfApproveState.None; task.ExecuteTime = DateTimeUtils.CurrentDateTimeStr; task.UpdateBy = runner.UserId; task.UpdateName = runner.UserName; task.Suggestion = runner.Comment; task.UpdateDate = DateTimeUtils.CurrentDateTimeStr; Update(task); } }
/// <summary> /// 读取任务,设置任务为待处理状态 /// </summary> /// <param name="taskID"></param> /// <param name="userID"></param> /// <param name="userName"></param> internal void SetNextTaskHandling(string activityInsUid, int seq) { DynamicParameters param = new DynamicParameters(); param.Add("ActivityInsUid", activityInsUid); param.Add("Seq", seq); WfTask wfTask = _dataAccessor.QueryFirstOrDefaultWhere <WfTask>("ActivityInsUid=@ActivityInsUid and ApproverSort=@Seq", param, false); if (wfTask != null) { wfTask.TaskState = WfTaskState.Handling; _dataAccessor.Update <WfTask>(wfTask); var activityIns = _dataAccessor.Get <WfActivityInstance>(activityInsUid); SendMessage(activityIns, wfTask); } }
/// <summary> /// 更新单据表(完成时) /// </summary> /// <param name="billTableName"></param> /// <param name="billId"></param> internal void UpdateBillDataWhenComplete(string billTableName, string billId) { FapTable table = DbSession.Table(billTableName); if (table == null || string.IsNullOrWhiteSpace(table.TableFeature)) { return; } if (("," + table.TableFeature + ",").IndexOf(",BillFeature,") >= 0) { //单据数据 dynamic billData = DbSession.Get(billTableName, billId); if (billData == null) { return; } DynamicParameters parameters = new DynamicParameters(); parameters.Add("ProcessId", ProcessId); //WfProcessInstance process = DbSession.QueryFirstOrDefaultEntityByWhere<WfProcessInstance>("Fid=@ProcessId", parameters); //WfTask task = DbSession.QueryFirstOrDefaultEntityBySql<WfTask>("select top 1 * from WfTask where ProcessId=@ProcessId order by Fid desc", parameters); //WfTaskAdvice taskAdvice = DbSession.QueryFirstOrDefaultEntityBySql<WfTaskAdvice>("select top 1 * from WfTaskAdvice where TaskId='" + task.Fid + "' order by Fid desc"); WfProcessInstance process = DbSession.Get <WfProcessInstance>(ProcessId); WfTask task = DbSession.Get <WfTask>(TaskId); //更新单据的字段数据 billData.CurrApprover = task.ExecutorEmpUid; billData.ApprovalTime = task.ExecuteTime; billData.ApprovalComments = task.Suggestion; if (task.ApproveState == WfApproveState.Agree) { billData.BillStatus = BillStatus.PASSED; //同意 } else if (task.ApproveState == WfApproveState.Disagree) { billData.BillStatus = BillStatus.REJECTED; //不同意 } billData.EffectiveState = 0; //billData.EffectiveTime = PublicUtils.GetSysDateTimeStr(); DbSession.UpdateDynamicData(billData); } }
/// <summary> /// 插入任务数据(创建任务) /// </summary> /// <param name="activity"></param> /// <param name="performerID"></param> /// <param name="performerName"></param> /// <param name="runnerID"></param> /// <param name="runnerName"></param> private void Insert(WfActivityInstance activityIns, string performerID, string performerName, int sort, string taskState = "Handling", bool isSignTask = false) { WfTask task = new WfTask(); task.AppName = activityIns.AppName; task.BillUid = activityIns.BillUid; task.TaskName = string.Format("{0}-{1}", activityIns.AppName, activityIns.NodeName); task.ActivityInsUid = activityIns.Fid; task.ProcessUid = activityIns.ProcessUid; task.ProcessInsUid = activityIns.ProcessInsUid; task.NodeId = activityIns.NodeId; task.NodeName = activityIns.NodeName; task.TaskType = WfTaskType.Manual; task.TaskActivityType = activityIns.ActivityType; task.ExecutorEmpUid = performerID; task.ExecutorEmpName = performerName; if ((activityIns.ActivityType == WfActivityType.TaskNode || activityIns.ActivityType == WfActivityType.TimerNode) && activityIns.ApproverMethod == ApproverMethodEnum.Queue.ToString() && sort > 1) { //当节点为普通节点审批方式为顺序完成的时候,第二个审批人需要等待 taskState = WfTaskState.Waiting; } task.TaskState = taskState; //1-办理状态 task.TaskStartTime = DateTimeUtils.CurrentDateTimeStr; task.ApproverSort = sort; task.RecordState = 1; task.BusinessUid = activityIns.BusinessUid; //task.BizName = activityInstance.BizName; task.AppEmpUid = activityIns.AppEmpUid; task.AppStartTime = activityIns.AppStartTime; task.ProcessState = activityIns.ProcessState; task.IsSignTask = isSignTask ? 1 : 0; //插入任务数据 Insert(task); if (task.TaskState == WfTaskState.Handling) { SendMessage(activityIns, task); } }
/// <summary> /// 设置任务完成 /// </summary> /// <param name="taskID">任务ID</param> /// <param name="runner"></param> /// <param name="wfLinqDataContext"></param> internal void Complete(string taskID, WfAppRunner runner) { //完成任务 WfTask task = GetTask(taskID); task.TaskState = WfTaskState.Completed; task.TaskEndTime = DateTimeUtils.CurrentDateTimeStr; task.ExecuteTime = DateTimeUtils.CurrentDateTimeStr; task.ApproveState = runner.ApproveState; task.Suggestion = runner.Comment; if (task.ExecutorEmpUid != runner.UserId) { //代理人审批 task.AgentEmpUid = runner.UserId; task.AgentEmpName = runner.UserName; } Update(task); //回写单据审批人 WriteBackBill(task); }
internal void SetTaskState(string taskId, WfAppRunner runner, string taskState) { WfTask task = _dataAccessor.Get <WfTask>(taskId, false); if (task != null) { task.TaskState = taskState; if (task.TaskState == WfTaskState.Rejected || task.TaskState == WfTaskState.Revoked || task.TaskState == WfTaskState.Backed) { task.ApproveState = WfApproveState.Disagree; } task.UpdateBy = runner.UserId; task.UpdateName = runner.UserName; task.Suggestion = runner.Comment; task.UpdateDate = DateTimeUtils.CurrentDateTimeStr; Update(task); } }
internal void SetTaskState(string taskId, string userID, string userName, string taskState) { WfTask task = _dataAccessor.Get <WfTask>(taskId, false); if (task != null) { task.TaskState = taskState; if (task.TaskState == WfTaskState.Rejected || task.TaskState == WfTaskState.Revoked || task.TaskState == WfTaskState.Backed) { task.ApproveState = WfApproveState.Disagree; } task.UpdateBy = userID; task.UpdateName = userName; task.UpdateDate = DateTimeUtils.CurrentDateTimeStr; Update(task); } }
/// <summary> /// 完成任务实例 /// </summary> /// <param name="taskView">任务视图</param> /// <param name="activityResource">活动资源</param> /// <param name="session">会话</param> internal bool CompleteWorkItem(WfTask taskView, WfAppRunner runner) { bool canContinueForwardCurrentNode = true; //流程强制拉取向前跳转时,没有运行人的任务实例 if (taskView != null) { //完成本任务,返回任务已经转移到下一个会签任务,不继续执行其它节点 base.TaskManager.Complete(taskView.Fid, runner); } //检查活动实例是否可以完成 if (base.ActivityInstanceManager.IsComplete(base.Linker.FromActivityInstance.Fid)) { //设置活动节点的状态为完成状态 base.ActivityInstanceManager.Complete(base.Linker.FromActivityInstance.Fid, runner); base.Linker.FromActivityInstance.ActivityState = ActivityStateEnum.Completed.ToString(); } else { canContinueForwardCurrentNode = false; //设置同一任务实例的下一个wftask if (base.Linker.FromActivityInstance.ActivityType != WfActivityType.SignNode && base.Linker.FromActivityInstance.ApproverMethod == ApproverMethodEnum.Queue.ToString()) { base.TaskManager.SetNextTaskHandling(taskView.ActivityInsUid, taskView.ApproverSort + 1); } //设置活动节点实例状态为运行态 base.Linker.FromActivityInstance.ActivityState = ActivityStateEnum.Running.ToString(); base.ActivityInstanceManager.Update(base.Linker.FromActivityInstance); } return(canContinueForwardCurrentNode); }
public bool AssignAgentTask(string taskId, WfAppRunner runner) { TaskManager tim = new TaskManager(_dataAccessor, _loggerFactory); WfTask task = tim.GetTask(taskId); if (task == null) { throw new FapException("任务不存在"); } Performer agent = runner.Agents[0]; TaskAdviceManager tam = new TaskAdviceManager(_dataAccessor, _applicationContext, _loggerFactory); tam.RecordWhenAssignAgentTask(runner.ProcessUid, runner.CurrNodeId, runner.Comment, agent.UserId, agent.UserName); task.AgentEmpUid = agent.UserId; task.AgentEmpName = agent.UserName; task.UpdateBy = runner.UserId; task.UpdateName = runner.UserName; task.UpdateDate = DateTimeUtils.CurrentDateTimeStr; tim.Update(task); return(true); }
/// <summary> /// 插入任务数据 /// </summary> /// <param name="entity">任务实体</param> /// <param name="wfLinqDataContext">linq上下文</param> internal void Insert(WfTask entity) { _dataAccessor.Insert <WfTask>(entity); }
/// <summary> /// 更新任务数据 /// </summary> /// <param name="entity"></param> /// <param name="wfLinqDataContext"></param> internal void Update(WfTask entity) { _dataAccessor.Update <WfTask>(entity); }
private void SendMessage(WfActivityInstance activityIns, WfTask task) { MessageManager msgManager = new MessageManager(_dataAccessor, _loggerFactory); msgManager.SendMessageWhenProcessing(activityIns, task); }
/// <summary> /// 更新单据表(处理中) /// </summary> /// <param name="billTableName"></param> /// <param name="billId"></param> internal void UpdateBillDataWhenProcessing(string billTableName, string billId) { FapTable table = DbSession.Table(billTableName); if (table == null || string.IsNullOrWhiteSpace(table.TableFeature)) { return; } if (("," + table.TableFeature + ",").IndexOf(",BillFeature,") >= 0) { //单据数据 dynamic billData = DbSession.Get(billTableName, billId); if (billData == null) { return; } DynamicParameters parameters = new DynamicParameters(); parameters.Add("ProcessId", ProcessId); //WfProcessInstance process = DbSession.QueryFirstOrDefaultEntityByWhere<WfProcessInstance>("Fid=@ProcessId", parameters); //WfTask task = DbSession.QueryFirstOrDefaultEntityBySql<WfTask>("select * from WfTask where ProcessId=@ProcessId order by Fid desc", parameters); //WfTask task = DbSession.QueryFirstOrDefaultEntityByWhere<WfTask>("ProcessId=@ProcessId",parameters,"Id desc"); //order by 查不到事务中的数据 //WfTaskAdvice taskAdvice = DbSession.QueryFirstOrDefaultEntityBySql<WfTaskAdvice>("select * from WfTaskAdvice where TaskId='" + task.Fid + "' order by Fid desc"); WfProcessInstance process = DbSession.Get <WfProcessInstance>(ProcessId); //WfTask task = DbSession.Get<WfTask>(TaskId); IEnumerable <WfTask> tasks = DbSession.QueryWhere <WfTask>(" ProcessId=@ProcessId and TaskState='Handling'", parameters); WfTask task = tasks.FirstOrDefault(); if (task == null) { throw new Exception("不存在新任务"); } //更新单据的字段数据 if (process.ProcessState == WfProcessInstanceState.Running) { billData.BillStatus = BillStatus.PROCESSING; billData.CurrApprover = task.ExecutorEmpUid; billData.ApprovalTime = PublicUtils.CurrentDateTimeStr; //task.ExecuteTime; billData.ApprovalComments = task.Suggestion; DbSession.UpdateDynamicData(billData); } else if (process.ProcessState == WfProcessInstanceState.Canceled) { billData.BillStatus = BillStatus.CANCELED; billData.CurrApprover = task.ExecutorEmpUid; billData.ApprovalTime = PublicUtils.CurrentDateTimeStr;// task.ExecuteTime; billData.ApprovalComments = task.Suggestion; DbSession.UpdateDynamicData(billData); } else if (process.ProcessState == WfProcessInstanceState.Deleted) { billData.BillStatus = BillStatus.CLOSED; billData.CurrApprover = task.ExecutorEmpUid; billData.ApprovalTime = PublicUtils.CurrentDateTimeStr;// task.ExecuteTime; billData.ApprovalComments = task.Suggestion; DbSession.UpdateDynamicData(billData); } else if (process.ProcessState == WfProcessInstanceState.Ended) { billData.BillStatus = BillStatus.CLOSED; billData.CurrApprover = task.ExecutorEmpUid; billData.ApprovalTime = PublicUtils.CurrentDateTimeStr;// task.ExecuteTime; billData.ApprovalComments = task.Suggestion; DbSession.UpdateDynamicData(billData); } else if (process.ProcessState == WfProcessInstanceState.Suspended) { billData.BillStatus = BillStatus.SUSPENDED; billData.CurrApprover = task.ExecutorEmpUid; billData.ApprovalTime = PublicUtils.CurrentDateTimeStr;// task.ExecuteTime; billData.ApprovalComments = task.Suggestion; DbSession.UpdateDynamicData(billData); } else if (process.ProcessState == WfProcessInstanceState.Withdrawed) { billData.BillStatus = BillStatus.WITHDRAWED; billData.CurrApprover = task.ExecutorEmpUid; billData.ApprovalTime = PublicUtils.CurrentDateTimeStr;// task.ExecuteTime; billData.ApprovalComments = task.Suggestion; DbSession.UpdateDynamicData(billData); } else if (process.ProcessState == WfProcessInstanceState.Revoked) { billData.BillStatus = BillStatus.REVOKED; billData.CurrApprover = task.ExecutorEmpUid; billData.ApprovalTime = PublicUtils.CurrentDateTimeStr;// task.ExecuteTime; billData.ApprovalComments = task.Suggestion; DbSession.UpdateDynamicData(billData); } } }
/// <summary> /// 查看审批单 /// </summary> /// <param name="BillUid"></param> /// <param name="BusinessUid"></param> /// <returns></returns> public IActionResult ApprovalViewBill(string billUid, string businessUid) { DynamicParameters param = new DynamicParameters(); param.Add("BillUid", billUid); param.Add("BusinessUid", businessUid); string sql = $"select * from WfTask where (ExecutorEmpUid='{_applicationContext.EmpUid}' or AgentEmpUid='{_applicationContext.EmpUid}') and BusinessUid=@BusinessUid and BillUid=@BillUid and TaskState in('Completed','Revoked')"; WfTask wfTask = _dbContext.QueryFirstOrDefault <WfTask>(sql, param); if (wfTask == null) { return(Content("没有找到审批数据")); } string activityInsUid = wfTask.ActivityInsUid; //获取表单类型 以及模板,字段权限 WfProcess wfProcess = _dbContext.Get <WfProcess>(wfTask.ProcessUid); WfActivityInstance wfActivityInstance = _dbContext.Get <WfActivityInstance>(activityInsUid); //表单模板 ViewBag.FormTemplate = wfActivityInstance.FormTemplate; //表单表 string tn = wfProcess.BillTable; ViewBag.Process = wfProcess; ViewBag.FormPower = wfActivityInstance.FormPower; //权限字段解析 int needEdit = 0;//存在需要编辑字段,审批的时候首先要保存 if (wfActivityInstance.FormPower.IsPresent()) { IList <FieldEntity> powers = JsonConvert.DeserializeObject <IList <FieldEntity> >(wfActivityInstance.FormPower); if (powers != null && powers.Any()) { var allColumns = _dbContext.Columns(tn); foreach (var field in powers) { string colName = field.FieldName; var column = allColumns.FirstOrDefault(col => col.ColName == colName); if (column != null && column.CtrlType == FapColumn.CTRL_TYPE_REFERENCE) { field.FieldName += "MC"; } field.FieldNameMC = column.ColComment; if (field.Property == Fap.Workflow.Engine.Enums.FieldPropertyEnum.Editable) { needEdit = 1; } } ViewBag.FormPower = powers.ToJsonIgnoreNullValue(); } } else { ViewBag.FormPower = "undefined"; } //是否编辑表单 ViewBag.IsEdit = needEdit; //审批任务 ViewBag.WfTask = wfTask; FormViewModel model = this.GetFormViewModel(tn, "frm-" + tn, billUid); model.FormStatus = AspNetCore.Controls.DataForm.FormStatus.View; return(View(model)); }
/// <summary> /// 审批单 /// </summary> /// <param name="BillUid"></param> /// <param name="BusinessUid"></param> /// <param name="agent"></param> /// <returns></returns> public IActionResult ApprovalBill(string billUid, string businessUid, int agent = 0) { DynamicParameters param = new DynamicParameters(); param.Add("BillUid", billUid); param.Add("BusinessUid", businessUid); string sql = string.Empty; if (agent == 1) { //获取代理人 var agents = _dbContext.QueryAll <WfAgentSetting>().Where(a => a.Agent == _applicationContext.EmpUid && a.State == 1);// _dbContext.QueryWhere<WfAgentSetting>($" Agent='{_applicationContext.EmpUid}' and [State]=1"); if (agents.Any()) { sql = $"select WfTask.* from WfTask,WfActivityInstance where WfTask.ActivityInsUid=WfActivityInstance.Fid and WfActivityInstance.ActivityState in('{WfActivityInstanceState.Running}','{WfActivityInstanceState.Ready}') and WfTask.ExecutorEmpUid in @Agent and WfTask.BusinessUid=@BusinessUid and WfTask.BillUid=@BillUid and WfTask.TaskState='Handling'"; param.Add("Agent", agents.Select(a => a.Principal)); } else { sql = $"select WfTask.* from WfTask where 1=2"; } } else { sql = $"select WfTask.* from WfTask,WfActivityInstance where WfTask.ActivityInsUid=WfActivityInstance.Fid and WfActivityInstance.ActivityState in('{WfActivityInstanceState.Running}','{WfActivityInstanceState.Ready}') and WfTask.ExecutorEmpUid='{_applicationContext.EmpUid}' and WfTask.BusinessUid=@BusinessUid and WfTask.BillUid=@BillUid and WfTask.TaskState='Handling'"; } WfTask wfTask = _dbContext.QueryFirstOrDefault <WfTask>(sql, param); if (wfTask == null) { return(Content("没有找到要审批的任务")); } string activityInsUid = wfTask.ActivityInsUid; //获取表单类型 以及模板,字段权限 WfProcess wfProcess = _dbContext.Get <WfProcess>(wfTask.ProcessUid); WfActivityInstance wfActivityInstance = _dbContext.Get <WfActivityInstance>(activityInsUid); //表单模板 ViewBag.FormTemplate = wfActivityInstance.FormTemplate; //表单表 string tn = wfProcess.BillTable; ViewBag.Process = wfProcess; ViewBag.FormPower = wfActivityInstance.FormPower; //权限字段解析 int needEdit = 0;//存在需要编辑字段,审批的时候首先要保存 if (wfActivityInstance.FormPower.IsPresent()) { IList <FieldEntity> powers = JsonConvert.DeserializeObject <IList <FieldEntity> >(wfActivityInstance.FormPower); if (powers != null && powers.Any()) { var allColumns = _dbContext.Columns(tn); foreach (var field in powers) { string colName = field.FieldName; var column = allColumns.FirstOrDefault(col => col.ColName == colName); if (column != null && column.CtrlType == FapColumn.CTRL_TYPE_REFERENCE) { field.FieldName += "MC"; } field.FieldNameMC = column.ColComment; if (field.Property == Fap.Workflow.Engine.Enums.FieldPropertyEnum.Editable) { needEdit = 1; } } ViewBag.FormPower = powers.ToJsonIgnoreNullValue(); } } else { ViewBag.FormPower = "undefined"; } //是否编辑表单 ViewBag.IsEdit = needEdit; //审批任务 ViewBag.WfTask = wfTask; FormViewModel model = this.GetFormViewModel(tn, "frm-" + tn, billUid); return(View(model)); }
/// <summary> /// 创建任务执行上下文对象 /// </summary> /// <param name="task"></param> /// <param name="processModel"></param> /// <param name="activityResource"></param> /// <returns></returns> internal static ActivityForwardContext CreateRunningContext(WfTask task, IProcessModel processModel, WfProcessInstance processInstance, WfActivityInstance fromActivityInstance) { return(new ActivityForwardContext(task, processModel, processInstance, fromActivityInstance)); }
/// <summary> /// 流程执行过程中,发送消息 /// </summary> /// <param name="activityIns">活动实例</param> /// <param name="wfTask">任务</param> public void SendMessageWhenProcessing(WfActivityInstance activityIns, WfTask wfTask) { //$"{{'approver':1,'applicant':1,'mail':1,'message':1}"; string messageSetting = activityIns.MessageSetting; bool noticeApplicant = false;//通知申请人 bool noticeApprover = false;//通知审批人 bool sendMessage = false;//发消息 bool sendMail = false;//发邮件 if (messageSetting.IsPresent()) { var jmset = JObject.Parse(messageSetting); noticeApplicant = jmset.GetValue("applicant").ToBool(); noticeApprover = jmset.GetValue("approver").ToBool(); sendMail = jmset.GetValue("mail").ToBool(); sendMessage = jmset.GetValue("message").ToBool(); } //通知申请人 if (noticeApplicant && activityIns.AppEmpUid.IsPresent()) { Employee employee = _dataAccessor.Get<Employee>(activityIns.AppEmpUid); if (employee == null) { return; } if (sendMail) { string title = $"您的{activityIns.AppName}已经审批到[{wfTask.ExecutorEmpName}],请知晓。"; string content = title + "详情请登录系统查看。"; SendMailToAssignee(title, employee.EmpName, $"{employee.EmpName}<{employee.Mailbox}>", content); } if (sendMessage) { SendInmsgToAssignee(employee.Fid, $"您的{activityIns.AppName}已经审批到[{wfTask.ExecutorEmpName}],请知晓。"); } } //通知审批人 if (noticeApprover && wfTask.ExecutorEmpUid.IsPresent()) { Employee employee = _dataAccessor.Get<Employee>(wfTask.ExecutorEmpUid); if (employee == null) { return; } if (sendMail) { var biz = _dataAccessor.Get<WfBusiness>(activityIns.BusinessUid, false); string title = $"有一份\"{activityIns.AppName}\"的待处理任务需要您处理!"; string where = "TableName='" + biz.BillEntity + "' and Enabled=1 and ModuleUid='BillMailTmpl'"; var emailTemplates = _dataAccessor.QueryWhere<CfgEmailTemplate>(where, null, false); //流程中通知业务处理人模板 CfgEmailTemplate emailTemplate = emailTemplates.Where(t => t.Code == "NoticeApprover").FirstOrDefault(); string content = string.Empty; if (emailTemplate != null) { var process = _dataAccessor.Get<WfProcessInstance>(activityIns.ProcessInsUid, true); //内容 content = emailTemplate.TemplateContent; content = BuildeMessageContent(process, content); if (content.Contains("${业务处理时间}")) { content = content.Replace("${业务处理时间}", activityIns.StartTime); } if (content.Contains("${业务流程状态}")) { content = content.Replace("${业务流程状态}", process.ProcessStateMC); } if (content.Contains("${业务审批结论}")) { content = content.Replace("${业务审批结论}", ""); } if (content.Contains("${业务审批意见}")) { content = content.Replace("${业务审批意见}", ""); } if (content.Contains("${业务处理人}")) { content = content.Replace("${业务处理人}", ""); } } else { content = $"有一份\"{activityIns.AppName}\"的待处理任务需要您处理!请登录系统操作。"; } SendMailToAssignee(title, employee.EmpName, $"{employee.EmpName}<{employee.Mailbox}>", content); } if (sendMessage) { string content = $"有一份\"{activityIns.AppName}\"的待处理任务需要您处理!"; SendInmsgToAssignee(employee.Fid, content); } } }