Exemple #1
0
        /// <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);
                    }
                };
            }
        }
Exemple #2
0
        /// <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);
                        }
                    };
                }
            }
        }
Exemple #3
0
        /// <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);
                    }
                };
            }
        }