/// <summary>
        /// �ύһ��������
        /// </summary>
        /// <param name="functionNo">����</param>
        /// <param name="recordValue">����ֵ</param>
        /// <param name="recordTitle">����</param>
        /// <param name="submitEmpId">�ύ��id</param>
        /// <param name="stepNo">��ǰ������</param>
        /// <param name="type">0:��һ���ύ������1���Զ���ת��2:���</param>
        /// <param name="checkEmp">������ִ����</param>
        public void Submit(string functionNo, string recordValue, string recordTitle, int submitEmpId, int stepNo, int type, string checkEmp)
        {
            //�������״��ύ����ʱ���ȷ��͹�������Ϣ���ù����������µ�һ�����赱��
            //д�빤�����б�����
            vWFunctionData vfunctionData = new vWFunctionData();
            WFunctionBB functionBB = new WFunctionBB();
            HEemployeeBB userBB = new HEemployeeBB();
            WFunctionStepBB functionStepBB = new WFunctionStepBB();

            SqlTransaction trans = null;
            try
            {
                if (this.transaction == null)
                {
                    trans = this.connection.BeginTransaction("TransSubmit");
                    this.runListBB.Transaction = trans;
                    this.commBB.Transaction = trans;
                }

                //ȡ�øù�����������ǰ�������������������
                //ѭ�����뵽��������¼��
                DataSet ds = new DataSet();
                ds = functionStepBB.GetStepList(functionNo, stepNo);

                //ȡ�ù���������������Ϣ
                vfunctionData = functionBB.GetVModel(functionNo);

                int runNo;
                //�Զ���תʱ����ȡ�������������
                if (type == 1)
                {
                    runNo = this.runListBB.GetLastRunNo(functionNo, recordValue, 0);
                }
                else
                {
                    runNo = this.runListBB.GetNewRunNo(functionNo, recordValue);
                }

                if (ds.Tables[0].Rows.Count > 0)
                {
                    for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
                    {
                        DataRow row = ds.Tables[0].Rows[i];
                        //ȡ��ԭʼ����������
                        string workTableNm;
                        string recordKeyField;
                        bool keyIsInt = false;
                        string condition = "";

                        workTableNm = vfunctionData.workTableNm;
                        recordKeyField = vfunctionData.recordKeyField;
                        keyIsInt = vfunctionData.keyIsInt;
                        condition = row["condition"].ToString();

                        //�жϵ�ǰ�������������������������Ƿ�����
                        string strSql = "select 1 from " + workTableNm;
                        if (keyIsInt)
                        {
                            strSql += " where " + recordKeyField + "=" + recordValue;
                        }
                        else
                        {
                            strSql += " where " + recordKeyField + "='" + recordValue + "'";
                        }
                        strSql += condition;
                        DataSet cds = new DataSet();
                        cds = this.commBB.Query(strSql);
                        if (cds.Tables[0].Rows.Count == 0)
                        {
                            continue;
                        }

                        WRunListData runListData = new WRunListData();

                        //д�빤������¼��
                        runListData.functionNo = functionNo;
                        runListData.runNo = runNo;
                        runListData.stepId = Convert.ToInt32(row["id"]);
                        runListData.isApplyChange = (type == 2 ? true : false);

                        if (checkEmp != "")
                        {
                            runListData.doEmp = checkEmp;
                        }
                        else
                        {
                            //ȡ��ÿһ����Ĺ�����ִ����
                            string useEmpId = "";

                            bool isUseEmpDo = false;
                            bool isUseEmpLeaderDo = false;
                            string doEmp;

                            if (row["isUseEmpDo"] != DBNull.Value)
                            {
                                isUseEmpDo = Convert.ToBoolean(row["isUseEmpDo"]);
                            }

                            if (row["isUseEmpLeaderDo"] != DBNull.Value)
                            {
                                isUseEmpLeaderDo = Convert.ToBoolean(row["isUseEmpLeaderDo"]);
                            }

                            doEmp = row["doEmp"].ToString();

                            //����ɼ�¼Я���߻��¼Я���ߵIJ��Ÿ�������������ȡ����¼Я����
                            if (isUseEmpDo || isUseEmpLeaderDo)
                            {
                                strSql = "select " + vfunctionData.useEmpField + " from " + workTableNm;
                                if (keyIsInt)
                                {
                                    strSql += " where " + recordKeyField + "=" + recordValue;
                                }
                                else
                                {
                                    strSql += " where " + recordKeyField + "='" + recordValue + "'";
                                }

                                DataSet dds = new DataSet();
                                dds = this.commBB.Query(strSql);
                                if (dds.Tables[0].Rows.Count == 0)
                                {
                                    throw new Exception("�������������ò���ȷ���޷�������");
                                }
                                useEmpId = Convert.ToString(dds.Tables[0].Rows[0][0]);
                            }

                            //����Ǽ�¼Я��������
                            if (isUseEmpDo)
                            {
                                runListData.doEmp += "p___" + useEmpId;
                            }
                            //����Ǽ�¼Я���ߵIJ��Ÿ���������
                            else if (isUseEmpLeaderDo)
                            {
                                //ȡ��ԭʼ���������˵IJ��Ÿ�����
                                DataSet dds = new DataSet();
                                dds = userBB.GetVList("empId=" + useEmpId);
                                if (dds.Tables[0].Rows.Count == 0)
                                {
                                    throw new Exception("��Ա�����쵼û�����ã��޷�������");
                                }

                                DataRow drow = dds.Tables[0].Rows[0];

                                //����н�ɫ���壬���ɾ��иý�ɫ�IJ��Ÿ����˽�������
                                if (doEmp != "")
                                {
                                    runListData.doEmp += doEmp.Replace("R_", "R_" + drow["nowDepartId"].ToString());
                                }
                                else
                                {
                                    runListData.doEmp += "p___" + drow["departLeader"].ToString();
                                }
                            }
                            //������ɫ����
                            else
                            {
                                runListData.doEmp += doEmp;
                            }
                        }

                        runListData.recordValue = recordValue;
                        runListData.recordTitle = recordTitle;
                        runListData.empId = submitEmpId;
                        runListData.creattime = DateTime.Now.ToString();
                        runListData.isRead = false;
                        runListData.isEnd = false;
                        runListData.workFlowState = WorkFlowState.WorkAuditing;

                        this.runListBB.AddRecord(runListData);
                    }
                    if (type == 0)
                    {
                        //����ԭʼ����״̬
                        this.SetWorkFlowState(functionNo, recordValue, WorkFlowState.WorkAuditing);
                    }
                }

                if (this.transaction == null) trans.Commit();
            }
            catch (Exception ex)
            {
                if (this.transaction == null) trans.Rollback("TransSubmit");
                throw ex;
            }
            finally
            {
                userBB.Dispose();
                functionBB.Dispose();
                functionStepBB.Dispose();
            }
        }
        /// <summary>
        /// �����ύһ���������������ύ��ָ���Ĺ�����ִ����
        /// </summary>
        /// <param name="functionNo">����</param>
        /// <param name="recordValue">����ֵ</param>
        /// <param name="recordTitle">����</param>
        /// <param name="submitEmpId">�ύ��id</param>
        /// <param name="checkEmp">������ִ����</param>
        /// <returns>�Ƿ��Զ�����</returns>
        public bool Submit(string functionNo, string recordValue, string recordTitle, int submitEmpId, string checkEmp)
        {
            WFunctionBB functionBB = new WFunctionBB();
            try
            {
                //�жϹ������Ƿ��Զ�����
                if (functionBB.IsAutoAudit(functionNo))
                {
                    //���µ���״̬
                    this.SetWorkFlowInfo(functionNo, recordValue, WorkFlowState.WorkAudited,
                        submitEmpId.ToString(), DateTime.Now.ToString());
                    return true;
                }
                else
                {

                    WFunctionStepBB functionStepBB = new WFunctionStepBB();
                    try
                    {
                        this.Submit(functionNo, recordValue, recordTitle, submitEmpId, functionStepBB.GetNextStep(functionNo, 0), 0, checkEmp);
                    }
                    finally
                    {
                        functionStepBB.Dispose();
                    }
                    return false;
                }
            }
            finally
            {
                functionBB.Dispose();
            }
        }
        /// <summary>
        /// ��ȡ���ݹ�����״̬
        /// </summary>
        /// <param name="workTableNm">���ݱ�</param>
        /// <param name="recordKeyField">�����ֶ�</param>
        /// <param name="keyIsInt">��������</param>
        /// <param name="recordValue">����ֵ</param>
        /// <returns>������״̬</returns>
        public string GetWorkFlowState(string functionNo, string recordValue)
        {
            vWFunctionData vfunctionData = new vWFunctionData();
            WFunctionBB functionBB = new WFunctionBB();
            DataSet ds = new DataSet();
            string ret = "";
            try
            {
                //ȡ����������Ӧ���ݱ���Ϣ
                string workTableNm;
                string recordKeyField;
                string workFlowStateField;
                string workFlowSeqField;
                bool keyIsInt = false;

                vfunctionData = functionBB.GetVModel(functionNo);

                if (vfunctionData == null)
                {
                    throw new Exception("�Ҳ����������������ã��޷�������");
                }

                workTableNm = vfunctionData.workTableNm;
                recordKeyField = vfunctionData.recordKeyField;
                workFlowStateField = vfunctionData.workFlowStateField;
                workFlowSeqField = vfunctionData.workFlowSeqField;
                keyIsInt = vfunctionData.keyIsInt;

                //��ԭʼ����ȡ�ù�����״̬
                string strSql = "select " + workFlowStateField + " from " + workTableNm;
                if (keyIsInt)
                {
                    strSql += " where " + recordKeyField + "=" + recordValue;
                }
                else
                {
                    strSql += " where " + recordKeyField + "='" + recordValue + "'";
                }

                ds = this.commBB.Query(strSql);
                if (ds.Tables[0].Rows.Count == 0)
                {
                    throw new Exception("�Ҳ���ԭʼ���ݣ��޷�������");
                }
                ret = ds.Tables[0].Rows[0][0].ToString();
            }
            catch (Exception ex)
            {
                throw (ex);
            }
            finally
            {
                functionBB.Dispose();
            }

            return ret;
        }
        /// <summary>
        /// �õ��ݹ�����״̬
        /// </summary>
        /// <param name="functionNo">����</param>
        /// <param name="recordValue">����ֵ</param>
        /// <param name="workFlowState">������״̬</param>
        /// <param name="auditEmpId">������</param>
        /// <param name="auditDt">����ʱ��</param>
        public void SetWorkFlowInfo(string functionNo, string recordValue, string workFlowState, string auditEmpId, string auditDt)
        {
            vWFunctionData vfunctionData = new vWFunctionData();
            WFunctionBB functionBB = new WFunctionBB();
            try
            {
                //ȡ����������Ӧ���ݱ���Ϣ
                string workTableNm;
                string recordKeyField;
                string auditEmpIdField;
                string auditDtField;
                string workFlowStateField;
                string workFlowSeqField;
                string auditDegreeField;
                bool keyIsInt = false;

                vfunctionData = functionBB.GetVModel(functionNo);

                if (vfunctionData == null)
                {
                    throw new Exception("�Ҳ����������������ã��޷�������");
                }

                workTableNm = vfunctionData.workTableNm;
                recordKeyField = vfunctionData.recordKeyField;
                auditEmpIdField = vfunctionData.auditEmpIdField;
                auditDtField = vfunctionData.auditDtField;
                workFlowStateField = vfunctionData.workFlowStateField;
                workFlowSeqField = vfunctionData.workFlowSeqField;
                auditDegreeField = vfunctionData.auditDegreeField;
                keyIsInt = vfunctionData.keyIsInt;

                //��ȡԭʼ���ݱ�Ĺ�����״̬����֤Ҫ�����״̬�Ƿ�Ϸ�
                string oldState = this.GetWorkFlowState(functionNo, recordValue);

                switch (workFlowState)
                {
                    //���µ���״̬Ϊ���ύ
                    case WorkFlowState.WorkSubmiting:
                        if (oldState != WorkFlowState.WorkAuditing && oldState != WorkFlowState.WorkAudited)
                        {
                            throw new Exception("ԭʼ����״̬�Ѿ��ı�Ϊ��" + WorkFlowState.GetWorkFlowStateDesc(oldState)
                                + "���޷�����������");
                        }
                        break;
                    //���µ���״̬Ϊ�ύ
                    case WorkFlowState.WorkAuditing:
                        if (oldState != WorkFlowState.WorkSubmiting && oldState != WorkFlowState.WorkUnAudited)
                        {
                            throw new Exception("ԭʼ����״̬�Ѿ��ı�Ϊ��" + WorkFlowState.GetWorkFlowStateDesc(oldState)
                                + "���޷��ύ������");
                        }
                        break;
                    //���µ���״̬Ϊ��׼
                    //�Զ�����״���µ��ݿ���ֱ���ɴ��ύ��Ϊ����׼
                    case WorkFlowState.WorkAudited:
                        if (oldState != WorkFlowState.WorkSubmiting && oldState != WorkFlowState.WorkAuditing)
                        {
                            throw new Exception("ԭʼ����״̬�Ѿ��ı�Ϊ��" + WorkFlowState.GetWorkFlowStateDesc(oldState)
                                + "���޷�����������");
                        }
                        break;
                    //���µ���״̬Ϊδ��׼
                    case WorkFlowState.WorkUnAudited:
                        if (oldState != WorkFlowState.WorkAuditing)
                        {
                            throw new Exception("ԭʼ����״̬�Ѿ��ı�Ϊ��" + WorkFlowState.GetWorkFlowStateDesc(oldState)
                                + "���޷��ύ������");
                        }
                        break;
                    default:
                        break;
                }

                string updateStr = "update " + workTableNm + " set " + workFlowStateField + "='" + workFlowState
                    + "'," + workFlowSeqField + "='" + WorkFlowState.GetWorkFlowStateDesc(workFlowState) + "'";
                if (auditEmpId != "")
                {
                    updateStr += "," + auditEmpIdField + "=" + auditEmpId;
                }
                if (auditDt != "")
                {
                    updateStr += "," + auditDtField + "='" + auditDt + "'";
                }
                //��������������������׼��δ��׼ʱ
                if (auditDegreeField != "" && (workFlowState == WorkFlowState.WorkAudited || workFlowState == WorkFlowState.WorkUnAudited))
                {
                    updateStr += "," + auditDegreeField + "=isnull(" + auditDegreeField + ",0)+1";
                }
                if (keyIsInt)
                {
                    updateStr += " where " + recordKeyField + "=" + recordValue;
                }
                else
                {
                    updateStr += " where " + recordKeyField + "='" + recordValue + "'";
                }

                //���¹�������¼������Ϣ
                this.commBB.ExecuteSql(updateStr);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                functionBB.Dispose();
            }
        }
        /// <summary>
        /// ������һ��������
        /// </summary>
        /// <param name="functionNo">����</param>
        /// <param name="recordValue">����ֵ</param>
        /// <param name="recordTitle">����</param>
        /// <param name="applyEmpId">������id</param>
        /// <param name="checkEmp">������ִ����</param>
        /// <returns>�Ƿ��Զ�����</returns>
        public bool ApplyChange(string functionNo, string recordValue, string recordTitle, int applyEmpId, string checkEmp)
        {
            WFunctionBB functionBB = new WFunctionBB();
            try
            {
                //�жϹ������Ƿ��Զ�����
                if (functionBB.IsAutoAudit(functionNo))
                {
                    //���µ���״̬
                    this.SetWorkFlowInfo(functionNo, recordValue, WorkFlowState.WorkSubmiting,
                        applyEmpId.ToString(), DateTime.Now.ToString());
                    return true;
                }
                else
                {
                    //�жϵ�ǰ������������������
                    //�����������û�н�����������ֱ�Ӹ��µ���״̬����ֹ������
                    //����Ѿ����������ͱ����Ϣ����ǰ������
                    SqlTransaction trans = null;
                    try
                    {
                        if (this.transaction == null)
                        {
                            trans = this.connection.BeginTransaction("TransUnSubmit");
                            this.runListBB.Transaction = trans;
                            this.commBB.Transaction = trans;
                        }

                        //ȡ�����һ����������
                        int runNo = this.runListBB.GetLastRunNo(functionNo, recordValue, 0);

                        //ȡ�������������ĵ�ǰ����
                        int stepNo = this.runListBB.GetLastStepNo(functionNo, recordValue, 0, runNo);

                        //�ж���û��������
                        bool isSubmited = this.runListBB.GetIsSubmited(functionNo, recordValue, 0, runNo);

                        if (!isSubmited)
                        {
                            //���µ���״̬
                            this.SetWorkFlowInfo(functionNo, recordValue, WorkFlowState.WorkSubmiting,
                                "", "");
                            //����һ��������������ϢΪ����
                            string strSql = "update WRunList set isEnd=1 from WRunList a inner join WFunctionStep b"
                                + " on a.stepId=b.id where a.functionNo='" + functionNo + "' and a.recordValue='"
                                + recordValue + "' and a.runNo=" + runNo.ToString() + " and b.stepNo="
                                + stepNo.ToString() + " and isApplyChange=0";

                            this.commBB.ExecuteSql(strSql);
                        }
                        else
                        {
                            //��������������������Ӧ������������
                            this.Submit(functionNo, recordValue, recordTitle, applyEmpId, stepNo, 2, checkEmp);
                        }

                        if (this.transaction == null) trans.Commit();
                    }
                    catch (Exception ex)
                    {
                        if (this.transaction == null) trans.Rollback("TransUnSubmit");
                        throw ex;
                    }
                    return false;
                }
            }
            finally
            {
                functionBB.Dispose();
            }
        }