Example #1
0
        /// <summary>
        /// 线外控制流程
        /// </summary>
        /// <param name="itemCode"></param>
        /// <param name="result"></param>
        /// <returns></returns>
        public bool ContorlWf(string itemCode, WfResult result, string itemDesc)
        {
            bool      succ      = false;
            ItemState itemState = ItemState.Beginning;
            WfState   wfState   = WfState.Normal;

            if (result == WfResult.Stop) ////暂停
            {
                itemState = ItemState.Progressing;
                wfState   = WfState.Stop;
            }

            if (result == WfResult.Start)///启动
            {
                itemState = ItemState.Progressing;
                wfState   = WfState.Normal;
            }

            if (result == WfResult.Delete) ////终止
            {
                itemState = ItemState.Ending;
                wfState   = WfState.Delete;
            }

            string strSql = "update xm_xmxx set ItemState = '{1}', WfState = '{2}',ItemDesc = '{3}' where ItemCode in ({0})";

            strSql = string.Format(strSql, itemCode, ((int)itemState).ToString(), ((int)wfState).ToString(), itemDesc);
            succ   = OracleHelper.ExecuteCommand(strSql);
            return(succ);
        }
Example #2
0
        /// <summary>
        /// 创建流程实例
        /// </summary>
        /// <param name="wfItem"></param>
        /// <returns></returns>
        public WfReturn CreateInstance(WfItem wfItem)
        {
            WfReturn  result    = new WfReturn();
            ItemState itemState = ItemState.Beginning;
            WfState   wfState   = WfState.Normal;
            string    orderNo   = string.Empty;

            try
            {
                ////判断该项目的状态是否可以操作
                DataTable dt          = OracleHelper.ExecuteDataTable("select * from xm_xmxx where ItemCode in (" + wfItem.ItemCode + ")");
                WfState   ItemWfState = (WfState)EnumHelper.StringValueToEnum(typeof(WfState), dt.Rows[0]["wfState"].ToString());

                if (ItemWfState != WfState.Normal)
                {
                    result.Success    = false;
                    result.ResultDesc = string.Format("该项目处于{0}状态,无法操作",
                                                      EnumHelper.GetFieldDescription(typeof(WfState), (int)ItemWfState));
                    return(result);
                }

                ////当前环节信息(0为开始环节)
                WfNode curNode = this.GetNodeInfo(this.strFlowId, wfItem.NodeId);
                if (curNode == null)
                {
                    result.Success    = false;
                    result.ResultDesc = "获取当前环节信息失败!";
                    return(result);
                }

                ////下一环节信息
                WfNode nextNode   = null;
                string perNodeId  = string.Empty;
                string nextNodeId = string.Empty;
                ////存在跳转ID
                if (!string.IsNullOrEmpty(wfItem.SwicthNode))
                {
                    perNodeId  = wfItem.SwicthNode;
                    nextNodeId = wfItem.SwicthNode;
                }
                else
                {
                    perNodeId  = curNode.PerNode;
                    nextNodeId = curNode.NextNode;
                }

                ////退回操作--上一结点
                if (wfItem.Result == WfResult.Return)
                {
                    nextNode = this.GetNodeInfo(this.strFlowId, perNodeId);
                }
                ////同意操作--下一结点
                if (wfItem.Result == WfResult.Agree)
                {
                    nextNode = this.GetNodeInfo(this.strFlowId, nextNodeId);
                }

                ArrayList strSql = new ArrayList();
                string    tmpSql = string.Empty;

                if (curNode.PerNode == ((int)WorkFlowNode.Begin).ToString())////开始结点
                {
                    //// 1 删除该项目所有进程信息
                    tmpSql = "delete from wf_instance where itemcode = '{0}'";
                    tmpSql = string.Format(tmpSql, wfItem.ItemCode);
                    strSql.Add(tmpSql);
                    //// 2 插入开始环节的已完成记录
                    tmpSql = "Insert into wf_instance(flowid,itemcode,orderno,nodeid,perNode,nextNode,userid,username,result,resultdesc,begindate,enddate,state)"
                             + " values ('{0}','{1}',1,'{2}','{3}','{4}','{5}','{6}','{7}','{8}',sysdate,sysdate,1)";
                    tmpSql = string.Format(tmpSql, strFlowId, wfItem.ItemCode, curNode.NodeId,
                                           curNode.PerNode, curNode.NextNode, wfItem.UserId, wfItem.UserName,
                                           ((int)wfItem.Result).ToString(), wfItem.ResultDesc);
                    strSql.Add(tmpSql);
                    //// 3 插入下一环节的未完成记录
                    tmpSql = "Insert into wf_instance(flowid,itemcode,orderno,nodeid,perNode,nextNode,userid,username,result,resultdesc,begindate,enddate,state)"
                             + " values ('{0}','{1}',2,'{2}','{3}','{4}','','','','',sysdate,'',0)";
                    tmpSql = string.Format(tmpSql, strFlowId, wfItem.ItemCode, nextNode.NodeId,
                                           nextNode.PerNode, nextNode.NextNode);
                    strSql.Add(tmpSql);
                    itemState = ItemState.Progressing;
                    wfState   = WfState.Normal;
                }
                else ////任务结点
                {
                    //// 更新项目进程表中当前环节的状态
                    tmpSql = "update wf_instance set enddate = sysdate, state = 1,userid = '{2}',username = '******',result = '{4}', resultdesc = '{5}'"
                             + " where itemCode in ({0}) and nodeid = {1} and state = 0";
                    tmpSql = string.Format(tmpSql, wfItem.ItemCode, wfItem.NodeId, wfItem.UserId, wfItem.UserName, ((int)wfItem.Result).ToString(), wfItem.ResultDesc);
                    strSql.Add(tmpSql);

                    //// 插入下一环节的进程信息
                    if (wfItem.Result != WfResult.Delete)
                    {
                        tmpSql = "delete from wf_instance where itemCode in ({0}) and nodeid = {1} and state = 0";
                        tmpSql = string.Format(tmpSql, wfItem.ItemCode, nextNode.NodeId);
                        strSql.Add(tmpSql);

                        ////针对批量操作
                        string[] itemAry = wfItem.ItemCode.Split(',');

                        for (int i = 0; i < itemAry.Length; i++)
                        {
                            orderNo = getOrdernoByItem(itemAry[i]);
                            //// 插入下一环节的未完成记录
                            tmpSql = "Insert into wf_instance(flowid,itemcode,orderno,nodeid,perNode,nextNode,userid,username,result,resultdesc,begindate,enddate,state)"
                                     + " values ('{0}','{1}','{2}','{3}','{4}','{5}','','','','',sysdate,'',0)";
                            tmpSql = string.Format(tmpSql, strFlowId, itemAry[i], orderNo, nextNode.NodeId,
                                                   nextNode.PerNode, nextNode.NextNode);
                            strSql.Add(tmpSql);
                        }
                    }
                    if (nextNode != null)
                    {
                        if (nextNode.NodeType == NodeType.EndNode)
                        {
                            tmpSql = "update wf_instance set enddate = sysdate, state = 1,userid = '{2}',username = '******',result = '{4}', resultdesc = '{5}'"
                                     + " where itemCode in ({0}) and nodeid = {1} and state = 0";
                            tmpSql = string.Format(tmpSql, wfItem.ItemCode, nextNode.NodeId, wfItem.UserId,
                                                   wfItem.UserName, ((int)wfItem.Result).ToString(), wfItem.ResultDesc);
                            strSql.Add(tmpSql);
                        }
                    }

                    switch (wfItem.Result)
                    {
                    case WfResult.Agree:
                        if (nextNode.NodeType == NodeType.EndNode)
                        {
                            wfState   = WfState.Normal;
                            itemState = ItemState.Ending;
                        }
                        else
                        {
                            wfState   = WfState.Normal;
                            itemState = ItemState.Progressing;
                        }
                        break;

                    case WfResult.Return:
                        wfState   = WfState.Normal;
                        itemState = ItemState.Progressing;
                        break;

                    case WfResult.Delete:
                        wfState   = WfState.Delete;
                        itemState = ItemState.Ending;
                        break;
                    }
                }

                if (wfItem.Result == WfResult.Delete)
                {
                    tmpSql = "update xm_xmxx set itemstate = '{1}', wfstate = '{2}', ItemDesc = '{3}',read = 0 where ItemCode in ({0})";
                    tmpSql = string.Format(tmpSql, wfItem.ItemCode, ((int)itemState).ToString(), ((int)wfState).ToString(), wfItem.ResultDesc);
                    strSql.Add(tmpSql);
                }
                else
                {
                    //// 更新项目主表的状态标识
                    tmpSql = "update xm_xmxx set itemstage = '{1}', nodeid = '{2}', itemstate = '{3}', wfstate = '{4}',read = 0  where ItemCode in ({0})";
                    tmpSql = string.Format(tmpSql, wfItem.ItemCode, nextNode.Stage, nextNode.NodeId, ((int)itemState).ToString(), ((int)wfState).ToString());
                    strSql.Add(tmpSql);
                }

                bool succ = OracleHelper.ExecuteCommand(strSql);

                if (succ)
                {
                    if (curNode.NotifyType != string.Empty && nextNode != null)////有消息发送设置
                    {
                        ////发送消息
                        this.notifyUser(curNode, nextNode, wfItem);
                    }
                    result.Success    = true;
                    result.ResultDesc = "成功";
                    if (nextNode != null)
                    {
                        result.Stage    = nextNode.Stage;
                        result.NodeName = nextNode.NodeName;
                        this.changeNodeQx(wfItem.ItemCode.Split(',')[0], ref nextNode);
                        result.DepartList = this.getItemName(1, nextNode.NodeDepartCode);
                        result.RoleList   = this.getItemName(2, nextNode.NodeRoleId);
                        result.UserList   = this.getItemName(3, nextNode.NodeUserId);
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return(result);
        }