/// <summary>
        ///     执行审核的扩展流程
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        protected override bool DoAuditPass(TData data)
        {
            var jobs = UserJobDataAccess.All(p => p.EntityType == EntityType && p.DataId == data.Id && p.JobType == UserJobType.Audit);
            var nomy = jobs.Where(p => p.ToUserId != BusinessContext.Current.LoginUserId).ToList();

            if (nomy.Count(p => p.JobStatus == JobStatusType.Succeed) != nomy.Count)
            {
                data.AuditState = AuditStateType.Submit;
                return(base.DoAuditPass(data));
            }
            var supper = data as ILevelAuditData;

            if (supper == null || supper.LastLevel >= supper.DepartmentLevel)
            {
                return(base.DoAuditPass(data));
            }
            if (supper.DepartmentLevel > 1)
            {
                supper.DepartmentLevel -= 1;
            }
            var users = GetUpAuditUsers(supper.DepartmentLevel);

            if (users.Length == 0)
            {
                return(base.DoAuditPass(data));
            }
            UserJobData job = jobs.FirstOrDefault();

            if (job == null)
            {
                job = new UserJobData
                {
                    EntityType   = EntityType,
                    LinkId       = data.Id,
                    Title        = data.Title,
                    JobType      = UserJobType.Audit,
                    FromUserId   = BusinessContext.Current.LoginUserId,
                    FromUserName = BusinessContext.Current.LoginUser.RealName
                };
            }
            else
            {
                job.JobStatus = JobStatusType.None;
                job.DataState = DataStateType.None;
                job.IsFreeze  = false;
            }
            var bl = new UserJobBusinessLogic();

            foreach (var user in users)
            {
                job.Id       = 0;
                job.ToUserId = user;
                bl.AddNew(job);
            }
            data.AuditState = AuditStateType.Submit;
            return(base.DoAuditPass(data));
        }