/// <summary>
        /// 统计某个时间段内的某个部门以及其所有子部门的员工的报销统计情况
        /// </summary>
        /// <param name="startDt">统计的开始时间</param>
        /// <param name="endDt">统计的结束时间</param>
        /// <param name="departmentID">统计的部门编号</param>
        /// <returns></returns>
        /// <param name="companyID"></param>
        /// <param name="employeeName"></param>
        /// <param name="loginUser"></param>
        public List <EmployeeReimburseStatistics> EmployeeStatistics(DateTime startDt, DateTime endDt,
                                                                     int departmentID, int companyID, string employeeName,
                                                                     Account loginUser)
        {
            List <EmployeeReimburseStatistics> iRet = new List <EmployeeReimburseStatistics>();

            List <Employee> EmployeeList =
                new GetEmployee().GetEmployeeByConditionForReimburseStatistics
                    (employeeName, companyID, -1, departmentID, true);

            if (departmentID == -1) //如果查全部员工需去掉没有查询权限的员工
            {
                EmployeeList =
                    HrmisUtility.RemoteUnAuthEmployee(EmployeeList, AuthType.HRMIS, loginUser, HrmisPowers.A903);
            }
            //构建返回的List
            foreach (Employee employee in EmployeeList)
            {
                EmployeeReimburseStatistics employeeReimburseStatistics = new EmployeeReimburseStatistics();
                employeeReimburseStatistics.Employee = employee;
                CalculateEmployeeReimburse(employeeReimburseStatistics, employee.Account.Id, startDt, endDt);
                iRet.Add(employeeReimburseStatistics);
            }
            iRet = AddTotleItem(iRet);
            CaculateSumEmployeeReimburseStatistics(iRet);
            return(iRet);
        }
        /// <summary>
        /// 计算总计
        /// </summary>
        /// <param name="employeeReimburseStatisticsList"></param>
        /// <param name="isIncludeChildDeptMember"></param>
        private static void CaculateSumReimburseStatistics(
            List <EmployeeReimburseStatistics> employeeReimburseStatisticsList, bool isIncludeChildDeptMember)
        {
            EmployeeReimburseStatistics sumEmployeeReimburseStatistics = new EmployeeReimburseStatistics();

            sumEmployeeReimburseStatistics.Department         = new Department(0, "总计");
            sumEmployeeReimburseStatistics.Department.Members = new List <Account>();
            sumEmployeeReimburseStatistics.EmployeeReimburseStatisticsItemList.Add(new EmployeeReimburseStatisticsItem("总计"));
            if (employeeReimburseStatisticsList.Count <= 0)
            {
                return;
            }
            foreach (EmployeeReimburseStatistics employeeReimburseStatistics in employeeReimburseStatisticsList)
            {
                if (isIncludeChildDeptMember)
                //如果累积到上级部门的 则此方法只需累加第一层部门的所有CalculateValue
                {
                    continue;
                }
                sumEmployeeReimburseStatistics.Department.Members.AddRange(
                    employeeReimburseStatistics.Department.Members);
                for (int i = 0; i < employeeReimburseStatistics.EmployeeReimburseStatisticsItemList.Count; i++)
                {
                    sumEmployeeReimburseStatistics.EmployeeReimburseStatisticsItemList[i].CalculateValue +=
                        employeeReimburseStatistics.EmployeeReimburseStatisticsItemList[i].CalculateValue;
                }
            }
            employeeReimburseStatisticsList.Add(sumEmployeeReimburseStatistics);
        }
        private void CalculateEmployeeReimburse(EmployeeReimburseStatistics employeeReimburseStatistics,
                                                int employeeID, DateTime startDt, DateTime endDt)
        {
            List <string> itemList = ReimburseItem.GetReimburseTypeEnumListTravel();
            //查找某时间段,某员工的报销结束的报销单
            List <Model.Reimburse> reimburseList =
                _DalReimburse.GetReimburseByEmployeeIDBillingTime(employeeID, startDt, endDt);

            if (reimburseList == null || reimburseList.Count == 0)
            {
                return;
            }
            //循环每一个需要统计的项,累加结果
            for (int i = 0; i < itemList.Count; i++)
            {
                List <Model.Reimburse> reimburseItemList =
                    Model.Reimburse.FindReimburseByType(reimburseList, itemList[i]);
                if (reimburseItemList == null || reimburseItemList.Count == 0)
                {
                    continue;
                }
                List <Model.Reimburse> reimburseadded = new List <Model.Reimburse>();
                foreach (Model.Reimburse reimburse in reimburseItemList)
                {
                    foreach (ReimburseItem reimburseItem in reimburse.ReimburseItems)
                    {
                        employeeReimburseStatistics.EmployeeReimburseStatisticsItemList[i].CalculateValue +=
                            reimburseItem.ExchangeCost;
                    }
                    if (reimburse.ReimburseCategoriesEnum == ReimburseCategoriesEnum.TravelReimburse)
                    {
                        if (!Contains(reimburseadded, reimburse.ReimburseID))
                        {
                            employeeReimburseStatistics.EmployeeReimburseStatisticsItemList[i].CalculateValue +=
                                reimburse.OutCityAllowance;
                            reimburseadded.Add(reimburse);
                        }
                    }
                }
            }
        }
        /// <summary>
        /// 计算总计
        /// </summary>
        /// <param name="employeeReimburseStatisticsList"></param>
        private static void CaculateSumEmployeeReimburseStatistics(
            List <EmployeeReimburseStatistics> employeeReimburseStatisticsList)
        {
            EmployeeReimburseStatistics sumEmployeeReimburseStatistics = new EmployeeReimburseStatistics();

            sumEmployeeReimburseStatistics.Employee         = new Employee();
            sumEmployeeReimburseStatistics.Employee.Account = new Account(0, "", "总计");
            sumEmployeeReimburseStatistics.EmployeeReimburseStatisticsItemList.Add(new EmployeeReimburseStatisticsItem("总计"));
            if (employeeReimburseStatisticsList.Count <= 0)
            {
                return;
            }
            foreach (EmployeeReimburseStatistics employeeReimburseStatistics in employeeReimburseStatisticsList)
            {
                for (int i = 0; i < employeeReimburseStatistics.EmployeeReimburseStatisticsItemList.Count; i++)
                {
                    sumEmployeeReimburseStatistics.EmployeeReimburseStatisticsItemList[i].CalculateValue +=
                        employeeReimburseStatistics.EmployeeReimburseStatisticsItemList[i].CalculateValue;
                }
            }
            employeeReimburseStatisticsList.Add(sumEmployeeReimburseStatistics);
        }
        /// <summary>
        /// 统计某个时间段内的某个部门以及其所有子部门的员工的报销统计情况
        /// </summary>
        /// <param name="startDt">统计的开始时间</param>
        /// <param name="endDt">统计的结束时间</param>
        /// <param name="departmentID">统计的部门编号</param>
        /// <returns></returns>
        /// <param name="companyID"></param>
        /// <param name="isIncludeChildDeptMember"></param>
        /// <param name="loginUser"></param>
        public List <EmployeeReimburseStatistics> DepartmentStatistics(DateTime startDt, DateTime endDt, int departmentID,
                                                                       int companyID, bool isIncludeChildDeptMember,
                                                                       Account loginUser)
        {
            List <EmployeeReimburseStatistics> iRet = new List <EmployeeReimburseStatistics>();

            //划分月份
            List <DateTime> Months = SplitMonth(startDt, endDt);
            //查出每个月份月底这个时间点的,某一部门及其所有子部门(包括改过名字部门)
            List <Department> AllDepartment = GetAllDepartment(Months, departmentID);

            AllDepartment = Tools.RemoteUnAuthDeparetment(AllDepartment, AuthType.HRMIS, loginUser, HrmisPowers.A903);
            //构建返回的List
            foreach (Department department in AllDepartment)
            {
                EmployeeReimburseStatistics EmployeeReimburseStatistics = new EmployeeReimburseStatistics();
                EmployeeReimburseStatistics.Department = department;
                iRet.Add(EmployeeReimburseStatistics);
            }
            //得到这个月的所有部门
            List <Department> departmentList = _GetDepartmentHistory.GetDepartmentNoStructByDateTime(endDt);

            departmentList =
                Tools.RemoteUnAuthDeparetment(departmentList, AuthType.HRMIS, loginUser, HrmisPowers.A903);
            List <Employee> EmployeesSource =
                _GetEmployeeHistory.GetAllEmployeeByDepartmentAndDateTime(AllDepartment[0].Id, endDt, true);

            if (companyID != -1)
            {
                for (int x = 0; x < EmployeesSource.Count; x++)
                {
                    if (
                        EmployeesSource[x].EmployeeDetails == null ||
                        EmployeesSource[x].EmployeeDetails.Work == null ||
                        EmployeesSource[x].EmployeeDetails.Work.Company == null ||
                        EmployeesSource[x].EmployeeDetails.Work.Company.Id != companyID)
                    {
                        EmployeesSource.RemoveAt(x);
                        x--;
                    }
                }
            }
            List <Account> accountSource = EmployeeUtility.GetAccountListFromEmployeeList(EmployeesSource);

            for (int k = 0; k < AllDepartment.Count; k++)
            {
                //查找这个部门中的所有人,包括子部门
                AllDepartment[k].Members =
                    FindAllEmployeeByDepAndTime(departmentList, AllDepartment[k], accountSource,
                                                isIncludeChildDeptMember);

                //循环部门里的员工
                foreach (Account account in AllDepartment[k].AllMembers)
                {
                    CalculateEmployeeReimburse(iRet[k], account.Id, startDt, endDt);
                }
            }

            AddTotleItem(iRet);
            if (!isIncludeChildDeptMember)
            {
                CaculateSumReimburseStatistics(iRet, isIncludeChildDeptMember);
            }
            return(iRet);
        }