コード例 #1
0
        /// <summary>
        /// 지정된 부서에 소속된 직원들을 반환합니다.
        /// </summary>
        /// <param name="department">부서</param>
        /// <param name="hierarchyContainsKind">부서의 조상/자손도 포함할 것인가 여부</param>
        /// <param name="pageIndex">페이지 인덱스 (0부터 시작)</param>
        /// <param name="pageSize">페이지 크기 (0보다 커야 한다. 보통 10)</param>
        /// <param name="orders">정렬 순서</param>
        /// <returns>부서 소속원 컬렉션을 반환한다.</returns>
        public IPagingList<User> GetPageOfUserByDepartment(Department department,
                                                           HierarchyContainsKinds hierarchyContainsKind,
                                                           int pageIndex,
                                                           int pageSize,
                                                           params INHOrder<User>[] orders)
        {
            department.ShouldNotBeNull("department");
            department.Company.ShouldNotBeNull("company of department");

            var companyCode = department.Company.Code;

            // TODO : 이 함수는 검증해봐야 한다!!!
            // NOTE : 왜 Paging 시에 간단하게 DepartMember로 하지 않고, 직접 User로 해야 되냐면, 겸직인 경우 두번 나오게 된다. 그럼 Paging 처리가 이상하게 된다.););

            if(IsDebugEnabled)
                log.Debug(@"부서 소속 사원 정보를 가져옵니다. 부서의 상위 또는 하위 부서의 소속원들도 포함시킬 수 있습니다." +
                          @"department={0}, hierarchyContainsKind={1}, pageIndex={2}, pageSize={3}, orders={4}",
                          department, hierarchyContainsKind, pageIndex, pageSize, orders.CollectionToString());

            // Department 조회
            var departments = FindAllDepartmentByHierarchy(department, hierarchyContainsKind);

            Company @companyAlias = null;
            Department @departmentAlias = null;
            User @userAlias = null;

            // Department들의 소속부서원 정보의 모든 부서원의 Id 값 조회
            var userIdQuery =
                QueryOver.Of<DepartmentMember>()
                    .JoinAlias(dm => dm.Department, () => @departmentAlias)
                    .JoinAlias(() => @departmentAlias.Company, () => @companyAlias)
                    .AddWhere(() => @companyAlias.Code == companyCode)
                    .AddWhereRestrictionOn(u => u.Department).IsIn(departments.ToArray())
                    .JoinAlias(dm => dm.User, () => @userAlias)
                    .Select(Projections.Group(() => @userAlias.Id));

            // 부서원 Id를 조회하는 서브쿼리에 만족하는 모든 User 조회
            var query =
                QueryOver.Of<User>()
                    .JoinAlias(u => u.Company, () => @companyAlias)
                    .AddWhere(() => @companyAlias.Code == companyCode)
                    .WithSubquery.WhereProperty(u => u.Id).In(userIdQuery);

            return Repository<User>.GetPage(pageIndex, pageSize, query, orders);
        }
コード例 #2
0
        /// <summary>
        /// 지정된 부서에 소속된 직원들을 반환합니다.
        /// </summary>
        /// <param name="department">부서</param>
        /// <param name="hierarchyContainsKind">부서의 조상/자손도 포함할 것인가 여부</param>
        /// <returns>부서 소속원 컬렉션을 반환한다.</returns>
        public IList<User> FindAllUserByDepartment(Department department, HierarchyContainsKinds hierarchyContainsKind)
        {
            department.ShouldNotBeNull("department");

            if(IsDebugEnabled)
                log.Debug(@"부서 소속 사원 정보를 가져옵니다. 부서의 상위 또는 하위 부서의 소속원들도 포함시킬 수 있습니다... " +
                          @"department={0}, hierarchyContainsKind={1}",
                          department, hierarchyContainsKind);

            // 중복 사용자를 피하기 위해 HashedSet을 사용합니다.
            var users = new HashSet<User>();

            // 1. 조상부서에 소속된 직원 정보)
            if((hierarchyContainsKind & HierarchyContainsKinds.Ancestors) > 0)
                department.GetAncestors().RunEach(dept => dept.GetUsers().RunEach(u => users.Add(u)));

            // 2. 현재부서에 소속된 직원 정보
            if((hierarchyContainsKind & HierarchyContainsKinds.Self) > 0)
                department.GetUsers().RunEach(u => users.Add(u));

            // 3. 자손부서에 소속된 직원 정보)
            if((hierarchyContainsKind & HierarchyContainsKinds.Descendents) > 0)
                department.GetDescendents().RunEach(dept => dept.GetUsers().RunEach(u => users.Add(u)));

            return users.ToList();
        }
コード例 #3
0
        /// <summary>
        /// 지정된 부서의 조상 또는 자손의 소속 정보까지 가져올 것인가?  
        /// </summary>
        /// <param name="department">조회할 부서</param>
        /// <param name="hierarchyContainsKinds">부서의 조상/자손도 포함할 것인가 여부</param>
        /// <returns></returns>
        public IEnumerable<DepartmentMember> FindAllDepartmentMemberByDepartmentHierarchy(Department department,
                                                                                          HierarchyContainsKinds hierarchyContainsKinds)
        {
            department.ShouldNotBeNull("department");

            if(IsDebugEnabled)
                log.Debug(@"지정된 부서 및 부서의 조상/자손의 직원 소속 정보를 가져옵니다. department={0}, hierarchyContainsKind={1}",
                          department.Id, hierarchyContainsKinds);

            var departments = FindAllDepartmentByHierarchy(department, hierarchyContainsKinds);

            // 조회한 부서에 대한 부서-직원 소속 정보를 가져온다
            //
            return departments.SelectMany(d => d.Members);
        }
コード例 #4
0
        /// <summary>
        /// 지정된 부서와 옵션에 따라 하위 부서 또는 상위부서를 포함한 부서정보를 제공합니다.
        /// </summary>
        /// <param name="department">조회할 기준 부서</param>
        /// <param name="hierarchyContainsKind">부서의 조상/자손도 포함할 것인가 여부</param>
        /// <returns></returns>
        public IList<Department> FindAllDepartmentByHierarchy(Department department, HierarchyContainsKinds hierarchyContainsKind)
        {
            // NOTE: 현재는 Loop 방식을 사용하여 round-trip이 많이 발생하게끔 되어 있다. Second Cache로 속도를 극복할 수 밖에 없다.

            if(IsDebugEnabled)
                log.Debug(@"계층구조에 따른 부서 정보를 조회합니다. department={0}, hierarchyContainsKind={1}",
                          department, hierarchyContainsKind);

            var results = new List<Department>();

            if(department == null)
                return results;

            // 1. 조상 부서 조회 및 추가
            if((hierarchyContainsKind & HierarchyContainsKinds.Ancestors) > 0)
                results.AddRange(department.GetAncestors());

            // 2. 현재 부서 추가
            if((hierarchyContainsKind & HierarchyContainsKinds.Self) > 0)
                results.Add(department);

            // 3. 자손 부서 조회 및 추가
            if((hierarchyContainsKind & HierarchyContainsKinds.Descendents) > 0)
                results.AddRange(department.GetDescendents());

            return results;
        }
コード例 #5
0
        /// <summary>
        /// 지정된 Id에 해당하는 메뉴를 조회합니다. 옵션으로 조상, 자손 메뉴도 가져올 수 있도록 합니다.
        /// </summary>
        /// <param name="product">제품</param>
        /// <param name="code">메뉴 Id</param>
        /// <param name="hierarchyContainsKinds">메뉴의 조상/자손도 포함할 것인가 여부</param>
        /// <returns></returns>
        public IList<Menu> FindAllMenuByHierarchy(Product product, string code, HierarchyContainsKinds hierarchyContainsKinds)
        {
            // NOTE: 현재는 Loop 방식을 사용하여 round-trip이 많이 발생하게끔 되어 있다. Second Cache로 속도를 극복할 수 밖에 없다.

            product.ShouldNotBeNull("product");

            if(IsDebugEnabled)
                log.Debug(@"계층구조에 따른 메뉴 정보를 조회합니다. product={0}, code={1}, hierarchyContainsKinds={2}",
                          product, code, hierarchyContainsKinds);

            var results = new HashSet<Menu>();

            // 0. 현재 Menu 정보를 조회한다.
            var menu = FindOneMenuByProductAndCode(product, code);

            if(menu == null)
                return results.ToList();

            // 1. 현재 메뉴의 조상들 추가한다.
            if((hierarchyContainsKinds & HierarchyContainsKinds.Ancestors) > 0)
                menu.GetAncestors().RunEach(m => results.Add(m));

            // 2. 현재 메뉴를 추가한다.
            if((hierarchyContainsKinds & HierarchyContainsKinds.Self) > 0)
                results.Add(menu);

            // 3. 현재 메뉴의 자손들을 추가한다.
            if((hierarchyContainsKinds & HierarchyContainsKinds.Descendents) > 0)
                menu.GetDescendents().RunEach(m => results.Add(m));

            return results.ToList();
        }
コード例 #6
0
        /// <summary>
        /// 지정된 Id에 해당하는 메뉴 템플릿을 조회합니다. 옵션으로 조상, 자손 메뉴 템플릿도 가져올 수 있도록 합니다.
        /// </summary>
        /// <param name="product">제품 정보</param>
        /// <param name="menuTemplateId">메뉴 템플릿 Id</param>
        /// <param name="hierarchyContainsKinds">메뉴 템플릿의 조상/자손도 포함할 것인가 여부</param>
        public IList<MenuTemplate> FildAllMenuTemplateByHierarchy(Product product, string menuTemplateId, HierarchyContainsKinds hierarchyContainsKinds)
        {
            // NOTE: 현재는 Loop 방식을 사용하여 round-trip이 많이 발생하게끔 되어 있다. Second Cache로 속도를 극복할 수 밖에 없다.
            //
            product.ShouldNotBeNull("product");

            if(IsDebugEnabled)
                log.Debug(@"계층구조에 따른 메뉴 템플릿 정보를 조회합니다. product={0}, code={1}, hierarchyContainsKinds={2}",
                          product, menuTemplateId, hierarchyContainsKinds);

            var results = new HashSet<MenuTemplate>();

            var menuTemplate = FindOneMenuTemplateByCode(product, menuTemplateId);

            if(menuTemplate == null)
                return results.ToList();

            // 1. 현재 메뉴 템플릿의 조상들 추가한다.
            if((hierarchyContainsKinds & HierarchyContainsKinds.Ancestors) > 0)
                menuTemplate.GetAncestors().RunEach(mt => results.Add(mt));

            // 2. 현재 메뉴 템플릿을 추가한다.
            if((hierarchyContainsKinds & HierarchyContainsKinds.Self) > 0)
                results.Add(menuTemplate);

            // 3. 현재 메뉴 템플릿의 자손들을 추가한다.
            if((hierarchyContainsKinds & HierarchyContainsKinds.Descendents) > 0)
                menuTemplate.GetDescendents().RunEach(mt => results.Add(mt));

            return results.ToList();
        }