/// <summary> /// 给流程实例所有未完成的待办发送已办消息 /// </summary> /// <param name="flowInstanceId">流程实例id</param> /// <param name="doneUserId">当前发送者</param> public void QXInsertAllFlowDone(int flowInstanceId, int doneUserId) { if (!isUpdate) { return; } var doneUser = dataOp.FindOneByQuery("SysUser", Query.EQ("userId", doneUserId.ToString())); //获取改流程实例当前的所有待办 var allPending = dataOp.FindAllByQuery("OAToDoNumber", Query.And( Query.EQ("tableName", "BusFlowInstance"), Query.EQ("referFieldName", "flowInstanceId"), Query.EQ("referFieldValue", flowInstanceId.ToString()), Query.EQ("status", "0") ) ).ToList(); foreach (var pending in allPending) { getBPMService pendingService = new getBPMService(); //发送已办命令,将待办转为已办 string guid = pending.String("todoGuid"); pendingService.setBPMDoingDBAsync( guid, //已办 GUID(即提交者当前待办 GUID) string.Empty, //流程开始节点 ID string.Empty, //流程结束节点 ID string.Empty //审批意见 ); pendingService.setBPMDoingDBCompleted += (sender, e) => { if (e.Error == null) { string now = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); string msg = string.Format("GUID: {0} 用户名: {1} 发送更新已办命令成功 ", guid, doneUser.Text("name")); log.Info(msg); BsonDocument updateDoc = new BsonDocument() { { "doneUserId", doneUserId.ToString() }, { "doneTime", now }, { "status", "1" } }; dataOp.Update("OAToDoNumber", Query.EQ("todoNumId", pending.Text("todoNumId")), updateDoc); } else { log.Error("GUID: {0} 发送已办出错", guid); log.Error(e.Error.Message); } }; } }
/// <summary> /// 推送已办消息 /// </summary> /// <param name="instance">流程实例</param> /// <param name="stepId">当前步骤id</param> /// <param name="doneUserId">执行者id</param> /// <param name="doneUserIdList">所有需要发送已办消息的人</param> public void QXInsertFlowDone(BsonDocument instance, int stepId, IEnumerable <int> doneUserIdList, int doneUserId) { if (!isUpdate) { return; } var allDoneUserIds = new List <int>(); if (doneUserIdList != null) { allDoneUserIds.AddRange(doneUserIdList); } allDoneUserIds.Add(doneUserId); allDoneUserIds = allDoneUserIds.Distinct().ToList(); var flowInstanceId = instance.Int("flowInstanceId"); var curStep = dataOp.FindOneByQuery("BusFlowStep", Query.EQ("stepId", stepId.ToString())); //var doneUser = dataOp.FindOneByQuery("SysUser", Query.EQ("userId", doneUserId.ToString())); var allDoneUsers = dataOp.FindAllByQuery("SysUser", Query.In("userId", allDoneUserIds.Select(i => (BsonValue)(i.ToString()))) ).ToList(); allDoneUserIds = allDoneUsers.Select(i => i.Int("userId")).ToList(); var allPenpens = dataOp.FindAllByQuery("OAToDoNumber", Query.And( Query.EQ("tableName", "BusFlowInstance"), Query.EQ("referFieldName", "flowInstanceId"), Query.EQ("referFieldValue", flowInstanceId.ToString()), Query.In("todoUserId", allDoneUserIds.Select(i => (BsonValue)(i.ToString()))), Query.EQ("stepOrder", curStep.Text("stepOrder")), Query.EQ("status", "0") ) ).ToList(); var allTraces = dataOp.FindAllByQuery("BusFlowTrace", Query.And( Query.EQ("preStepId", stepId.ToString()), Query.EQ("flowInstanceId", flowInstanceId.ToString()), Query.In("traceType", new List <BsonValue>() { "2", "6" }), Query.In("createUserId", allDoneUserIds.Select(i => (BsonValue)(i.ToString()))) ) ).GroupBy(i => i.Int("createUserId")) .Select(i => i.OrderBy(u => u.Date("createDate")).LastOrDefault()).ToList(); var allForms = dataOp.FindAllByQuery("BusFlowFormData", Query.In("formId", allTraces.Select(i => (BsonValue)(i.ToString()))) ).ToList(); foreach (var tempDoneUserId in allDoneUserIds) { var doneUser = allDoneUsers.Where(i => i.Int("userId") == tempDoneUserId).FirstOrDefault(); if (doneUser.IsNullOrEmpty()) { continue; } //获取对应的待办(因为会签步骤的关系,所以不用stepId而用stepOrder来查找) var penpen = allPenpens.Where(i => i.Int("todoUserId") == doneUser.Int("userId")) .OrderBy(i => i.Int("order")).LastOrDefault(); if (!penpen.IsNullOrEmpty()) { //获取审批记录,包括转办记录 string content = string.Empty; //var trace = dataOp.FindAllByQuery("BusFlowTrace", // Query.And( // Query.EQ("preStepId", stepId.ToString()), // Query.EQ("flowInstanceId", flowInstanceId.ToString()), // Query.In("traceType", new List<BsonValue>() { "2", "6" }), // Query.EQ("createUserId", doneUser.Text("userId")) // ) // ).LastOrDefault(); var trace = allTraces.Where(i => i.Int("createUserId") == doneUser.Int("userId")).FirstOrDefault(); string formId = trace.Text("formId"); if (!trace.IsNullOrEmpty()) { if (!string.IsNullOrEmpty(formId)) { //var form = dataOp.FindOneByQuery("BusFlowFormData", Query.EQ("formId", formId)); var form = allForms.Where(i => i.Text("formId") == formId).FirstOrDefault(); if (!form.IsNullOrEmpty() && !string.IsNullOrEmpty(form.Text("content"))) { content = form.Text("content"); } else { content = trace.Text("remark"); } } else { content = trace.Text("remark"); } } string guid = penpen.String("todoGuid"); getBPMService pendingService = new getBPMService(); //发送已办命令,将待办转为已办 pendingService.setBPMDoingDBAsync( guid, //已办 GUID(即提交者当前待办 GUID) string.Empty, //流程开始节点 ID string.Empty, //流程结束节点 ID content //审批意见 ); pendingService.setBPMDoingDBCompleted += (sender, e) => { if (e.Error == null) { string now = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); string msg = string.Format("GUID: {0} 用户名: {1} 发送更新已办命令成功 ", guid, doneUser.Text("name")); log.Info(msg); BsonDocument updateDoc = new BsonDocument() { { "doneUserId", doneUserId.ToString() }, { "doneTime", now }, { "status", "1" }, { "content", content } }; dataOp.Update("OAToDoNumber", Query.EQ("todoNumId", penpen.Text("todoNumId")), updateDoc); } else { log.Error("GUID: {0} 发送已办出错", guid); log.Error(e.Error.Message); } }; } } }
/// <summary> /// 发送流程审批待办 /// 事务正常执行或转办时调用 /// </summary> /// <param name="instance">流程实例</param> /// <param name="stepId">步骤id</param> /// <param name="submitUserId">提交者</param> /// <param name="todoUserIdList">待办者</param> public void QXInsertFlowToDo(BsonDocument instance, int stepId, int submitUserId, List <int> todoUserIdList) { if (!isUpdate) { return; } var flowInstanceId = instance.Int("flowInstanceId"); instance = dataOp.FindOneByQuery("BusFlowInstance", Query.EQ("flowInstanceId", flowInstanceId.ToString())); var flowId = instance.Text("flowId"); var referFieldValue = instance.Text("referFieldValue"); //记录在哪一步发送这条待办 var step = dataOp.FindOneByQuery("BusFlowStep", Query.EQ("stepId", stepId.ToString())); var stepOrder = step.Text("stepOrder"); var actTypeId = step.Text("actTypeId"); //获取提交者在内的所有相关人员 var allUserIdList = new List <int>(); allUserIdList.Add(submitUserId); allUserIdList.AddRange(todoUserIdList); var userList = dataOp.FindAllByQuery("SysUser", Query.In("userId", allUserIdList.Select(i => (BsonValue)(i.ToString()))) ).ToList(); allUserIdList = userList.Select(i => i.Int("userId")).Distinct().ToList(); todoUserIdList = todoUserIdList.Where(i => allUserIdList.Contains(i)).ToList(); //获取当前信息提交者,一般情况下为流程发起人 var submitUser = userList.FirstOrDefault(i => i.Int("userId") == submitUserId); string submitUserName = submitUser.Text("loginName"); //流程标题 string title = string.Format("请审批\"{0}\"", instance.Text("instanceName")); //待办事项链接地址(审批流程地址) string approvalUrl = string.Empty; switch (instance.Text("tableName")) { case "ProgrammeEvaluation": approvalUrl = "/ProgrammeEvaluation/EvaluationWorkFlowInfo?proEvalId=" + referFieldValue; break; case "DesignChange": approvalUrl = "/DesignManage/DesignChangeWorkFlowInfo?dngChangeId=" + referFieldValue; break; default: break; } if (string.IsNullOrEmpty(approvalUrl)) { return; } foreach (var userId in todoUserIdList) { getBPMService pendingService = new getBPMService(); //StorageData data = new StorageData(); var user = userList.FirstOrDefault(i => i.Int("userId") == userId); //生成链接地址 string linkUrl = string.Format("{0}/Account/Login_QXSSO?ReturnUrl={1}", SysAppConfig.HostDomain, HttpUtility.UrlEncode(approvalUrl)); string newGuid = Guid.NewGuid().ToString(); string now = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); log.Info("开始发送更新待办命令 用户名:{0}", user.Text("name")); //webservice更新待办 pendingService.setBPMTodoDBAsync( "INSERT", //写入或删除,值:"INSERT"或"UPDATE"或"DELETE" newGuid, //待办 GUID "YNH", //业务系统类型,用3个缩写代表银禾 user.Text("loginName"), //待办者 title, //标题 submitUserName, //提交者 now, //提交时间 linkUrl, //链接地址 string.Empty, //表单基础内容,缺省值“” string.Empty, //附件,缺省值“” string.Empty, //可提交的路由,缺省值“0” string.Empty, //可驳回的路由,缺省值“0” 0, //是否允许驳回,缺省值 0,0:不允许,1 允许 0, //是否允许协助,缺省值 0,0:不允许,1 允许 0, //是否允许转办,缺省值 0,0:不允许,1 允许 0, //是否允许结束,缺省值 0,0:不允许,1 允许 string.Empty //未知... ); pendingService.setBPMTodoDBCompleted += (sender, e) => { if (e.Error == null) { var newDoc = new BsonDocument() { { "tableName", "BusFlowInstance" }, { "referFieldName", "flowInstanceId" }, { "referFieldValue", instance.Text("flowInstanceId") }, { "flowId", flowId.ToString() }, { "stepId", stepId.ToString() }, { "stepOrder", stepOrder.ToString() }, { "actTypeId", actTypeId.ToString() }, { "todoUserId", userId.ToString() }, { "todoGuid", newGuid }, { "todoTime", now }, { "doneUserId", string.Empty }, { "doneTime", string.Empty }, { "status", "0" } }; dataOp.Insert("OAToDoNumber", newDoc); string msg = string.Format("GUID: {1} 用户名: {0} 发送更新(INSERT)待办命令成功", user.Text("name"), newGuid); log.Info(msg); } else { log.Error("给{0}发送待办出错,instanceId:{1},stepId:{2}", user.Text("name"), instance.Text("flowInstanceId"), stepId); log.Error(e.Error.Message); } }; } }