using System;
using System.Collections.Generic;
using System.Linq;
using Edu.Common;
using Edu.Common.Enum.Finance;
using Edu.Common.Plugin;
using Edu.Model.CacheModel;
using Edu.Model.Entity.Finance;
using Edu.Model.ViewModel.Course;
using Edu.Model.ViewModel.Finance;
using Edu.Model.ViewModel.Grade;
using Edu.Model.ViewModel.Sell;
using Edu.Repository.Course;
using Edu.Repository.Finance;
using Edu.Repository.Grade;
using Edu.Repository.Sell;
using Edu.Repository.StudyAbroad;
using Edu.Repository.User;
using VT.FW.DB;

namespace Edu.Module.Finance
{
    /// <summary>
    /// 财务处理类
    /// </summary>
    public class FinanceModule
    {
        /// <summary>
        /// 财务单据
        /// </summary>
        private readonly RB_FinanceRepository RB_FinanceRepository = new RB_FinanceRepository();
        /// <summary>
        /// 财务单据详情
        /// </summary>
        private readonly RB_FinanceDetailRepository RB_FinanceDetailRepository = new RB_FinanceDetailRepository();
        /// <summary>
        /// 财务单据模板
        /// </summary>
        private readonly Repository.Finance.Rb_Workflow_TemplateRepository Finance_TemplateRepository = new Repository.Finance.Rb_Workflow_TemplateRepository();
        /// <summary>
        /// 交易方式
        /// </summary>
        private readonly RB_TradeWayRepository tradeWayRepository = new RB_TradeWayRepository();
        /// <summary>
        /// 银行账户
        /// </summary>
        private readonly RB_BackAccountRepository RB_BackAccountRepository = new RB_BackAccountRepository();
        /// <summary>
        /// 币种
        /// </summary>
        private readonly RB_CurrencyRepository RB_CurrencyRepository = new RB_CurrencyRepository();
        /// <summary>
        /// 现金账户
        /// </summary>
        private readonly RB_CashAccountRepository cashAccountRepository = new RB_CashAccountRepository();
        /// <summary>
        /// 资金池账户仓储层对象
        /// </summary>
        private readonly RB_CashPoolAccountRepository cashPoolAccountRepository = new RB_CashPoolAccountRepository();
        /// <summary>
        /// 平台账户仓储层对象
        /// </summary>
        private readonly RB_PlatformAccountRepository platformAccountRepository = new RB_PlatformAccountRepository();
        /// <summary>
        /// 费用类型仓储层对象
        /// </summary>
        private readonly RB_CosttypeRepository costtypeRepository = new RB_CosttypeRepository();
        /// <summary>
        /// 账户类型管理
        /// </summary>
        private readonly RB_AccountTypeRepository RB_AccountTypeRepository = new RB_AccountTypeRepository();
        /// <summary>
        /// 财务单据凭证仓储层对象
        /// </summary>
        private readonly RB_VoucherRepository voucherRepository = new RB_VoucherRepository();
        /// <summary>
        /// 营收报表
        /// </summary>
        private readonly RB_Edu_RevenueReportRepository edu_RevenueReportRepository = new RB_Edu_RevenueReportRepository();
        /// <summary>
        /// 简易报表
        /// </summary>
        private readonly RB_SimpleReportRepository edu_simpleReportRepository = new RB_SimpleReportRepository();
        /// <summary>
        /// 报表更新记录
        /// </summary>
        private readonly RB_Report_UpdateRecordRepository edu_UpdateRecordRepository = new RB_Report_UpdateRecordRepository();
        /// <summary>
        /// 班级
        /// </summary>
        private readonly RB_ClassRepository classRepository = new RB_ClassRepository();
        /// <summary>
        /// 学生签到
        /// </summary>
        private readonly RB_Class_CheckRepository class_CheckRepository = new RB_Class_CheckRepository();

        /// <summary>
        /// 基础配置
        /// </summary>
        private readonly RB_Class_ConfigRepository class_ConfigRepository = new RB_Class_ConfigRepository();
        /// <summary>
        /// 班级类型
        /// </summary>
        private readonly RB_Class_TypeRepository class_TypeRepository = new RB_Class_TypeRepository();
        /// <summary>
        /// 订单列表
        /// </summary>
        private readonly RB_OrderRepository orderRepository = new RB_OrderRepository();
        /// <summary>
        /// 订单学生
        /// </summary>
        private readonly RB_Order_GuestRepository order_GuestRepository = new RB_Order_GuestRepository();
        /// <summary>
        /// 教师奖励明细
        /// </summary>
        private readonly RB_Teaching_BonusDetailRepository teaching_BonusDetailRepository = new RB_Teaching_BonusDetailRepository();
        /// <summary>
        /// 教师绩效
        /// </summary>
        private readonly RB_Teaching_PerfRepository teaching_PerfRepository = new RB_Teaching_PerfRepository();
        /// <summary>
        /// 销售提成明细
        /// </summary>
        private readonly RB_Sell_Commission_DetailsRepository sell_Commission_DetailsRepository = new RB_Sell_Commission_DetailsRepository();
        /// <summary>
        /// 业绩提成
        /// </summary>
        private readonly RB_Sell_Achievements_EmpRepository sell_Achievements_EmpRepository = new RB_Sell_Achievements_EmpRepository();
        /// <summary>
        /// 订单返佣
        /// </summary>
        private readonly RB_Order_ReturnComissionRepository order_ReturnComissionRepository = new RB_Order_ReturnComissionRepository();
        /// <summary>
        /// 学校仓储层对象
        /// </summary>
        private readonly RB_SchoolRepository schoolRepository = new RB_SchoolRepository();
        /// <summary>
        /// 留学就业
        /// </summary>
        private readonly RB_StudyAbroadRepository studyAbroadRepository = new RB_StudyAbroadRepository();
        /// <summary>
        /// 月结设置
        /// </summary>
        private readonly RB_RollingAccountRepository rollingAccountRepository = new RB_RollingAccountRepository();
        /// <summary>
        /// 账户
        /// </summary>
        private readonly RB_AccountRepository accountRepository = new RB_AccountRepository();
        /// <summary>
        /// 收据配置
        /// </summary>
        private readonly RB_Receipt_ConfigRepository receipt_ConfigRepository = new RB_Receipt_ConfigRepository();
        /// <summary>
        /// 收据
        /// </summary>
        private readonly RB_Receipt_InfoRepository receipt_InfoRepository = new RB_Receipt_InfoRepository();        
        /// <summary>
        /// 试听班级
        /// </summary>
        private readonly Repository.Reserve.RB_Reserve_ClassRepository reserve_ClassRepository = new Repository.Reserve.RB_Reserve_ClassRepository();



        public List<RB_Finance_Extend> GetFinanceInfoList(RB_Finance_Extend model)
        {
            var list = RB_FinanceRepository.GetListSingle(model)?.Where(x => x.Status != FinanceAuditStatus.Delete).ToList();
            List<RB_TradeWay_Extend> tdlist = new List<RB_TradeWay_Extend>();
            List<RB_FinanceDetail_Extend> fdlist = new List<RB_FinanceDetail_Extend>();
            List<Rb_Workflow_Auditrecord> walist = new List<Rb_Workflow_Auditrecord>();
            List<RB_Costtype_Extend> costlist = new List<RB_Costtype_Extend>();
            List<RB_Finance_Extend> tclist = new List<RB_Finance_Extend>();
            List<RB_Voucher_Extend> volist = new List<RB_Voucher_Extend>();
            if (list.Any())
            {
                string fridStr = string.Join(",", list.Select(x => x.FrID));
                tdlist = GetBankListForFrIdStr(fridStr, model.RB_Group_Id ?? 2);
                fdlist = RB_FinanceDetailRepository.GetList(new RB_FinanceDetail_Extend() { FrIds = fridStr });
                if (fdlist.Any())
                {
                    costlist = costtypeRepository.GetList(new RB_Costtype_Extend() { CostIds = string.Join(",", fdlist.Select(x => x.CostTypeId ?? 0)) });
                }
                walist = Finance_TemplateRepository.GetAgreeOrWaitList(new Rb_Workflow_Auditrecord() { AuditStatus = WFRrocessStatus.NotAudit }, fridStr);
                volist = voucherRepository.GetList(new RB_Voucher_Extend() { FrIdStr = fridStr });
            }

            foreach (var item in list)
            {
                item.BankList = new List<RB_TradeWay_Extend>();
                item.BankList = tdlist.Where(x => x.FinanceId == item.FrID).ToList();
                item.CostTypeList = new List<string>();
                var detailList = fdlist.Where(x => x.FinanceId == item.FrID).ToList();
                item.detailList = detailList;
                foreach (var detailitem in detailList)
                {
                    var cmodel = costlist.Where(x => x.ID == detailitem.CostTypeId).FirstOrDefault();
                    item.CostTypeList.Add(cmodel?.Name ?? "");
                }
                #region 判断是否可以操作单据
                item.AuditList = new List<AuditInfo>();
                if (item.Status == FinanceAuditStatus.InReview)
                {
                    var Auditdata = walist.Where(x => x.WorkFlowId == item.FrID).ToList();
                    foreach (var sitem in Auditdata)
                    {
                        AuditInfo auditInfo = new AuditInfo()
                        {
                            AuditEmId = sitem.AuditEmId,
                            AuditDate = null,
                            AuditEmName = sitem.AuditEmIdName
                        };
                        item.AuditList.Add(auditInfo);
                    }
                }
                if (item.Type == WFTempLateClassEnum.IN && item.Status == FinanceAuditStatus.CTemporary)
                {
                    //判断如果是平台的单子  需要把实付清0
                    var bankModel = item.BankList.FirstOrDefault();
                    if (bankModel != null)
                    {
                        if (bankModel.Type == BranchAccountEnum.Platform && (item.PayMoney ?? 0) > 0)
                        {
                            item.PayMoney = 0;
                        }
                    }
                }
                #endregion
                #region 团队编号
                //item.TCIDAndTCNUMList = tclist.Where(x => x.FrID == item.FrID).FirstOrDefault()?.TCIDAndTCNUMList ?? new List<TCIDInfo>();
                #endregion
                #region  凭证
                item.vorcherInos = volist.Where(x => x.FinanceId == item.FrID).ToList();
                #endregion
            }
            return list;
        }


        /// <summary>
        /// 批量获取财务单据的交易方式
        /// </summary>
        /// <param name="ID"></param>
        /// <returns></returns>
        public List<RB_TradeWay_Extend> GetBankListForFrIdStr(string FrIdStr, int GroupId)
        {
            if (string.IsNullOrWhiteSpace(FrIdStr))
            {
                return null;
            }
            List<RB_TradeWay_Extend> list = new List<RB_TradeWay_Extend>();
            var TradeList = tradeWayRepository.GetList(new RB_TradeWay_Extend() { FrIdStr = FrIdStr });
            //获取币种列表
            var CurrencyList = RB_CurrencyRepository.GetList(new Model.Entity.Finance.RB_Currency() { RB_Group_Id = GroupId });
            //查询四大账户
            var BankList = RB_BackAccountRepository.GetList(new RB_BackAccount_Extend() { AccountIdStr = string.Join(",", TradeList.Where(x => x.Type == BranchAccountEnum.Bank).Select(x => x.AccountId ?? 0).Distinct()) });
            var CashList = cashAccountRepository.GetList(new RB_CashAccount_Extend() { AccountIdStr = string.Join(",", TradeList.Where(x => x.Type == BranchAccountEnum.Cash).Select(x => x.AccountId ?? 0).Distinct()) });
            var CashPoolList = cashPoolAccountRepository.GetList(new RB_CashPoolAccount_Extend() { AccountIdStr = string.Join(",", TradeList.Where(x => x.Type == BranchAccountEnum.CashPool).Select(x => x.AccountId ?? 0).Distinct()) });
            var PlatformList = platformAccountRepository.GetList(new RB_PlatformAccount_Extend() { AccountIdStr = string.Join(",", TradeList.Where(x => x.Type == BranchAccountEnum.Platform).Select(x => x.AccountId ?? 0).Distinct()) });

            foreach (var TradeModel in TradeList)
            {
                RB_TradeWay_Extend accountInFo = TradeModel.RefMapperTo<RB_TradeWay_Extend>();
                accountInFo.CurrencyName = CurrencyList.Where(x => x.ID == TradeModel.CurrencyId).FirstOrDefault()?.Name ?? "";
                if (TradeModel.Type == Common.Enum.Finance.BranchAccountEnum.Bank)
                {
                    var bank = BankList.Where(x => x.ID == TradeModel.AccountId).FirstOrDefault();
                    if (bank != null)
                    {
                        accountInFo.Alias = bank.Alias;
                        accountInFo.BankNo = bank.BackNo;
                        accountInFo.Type = Common.Enum.Finance.BranchAccountEnum.Bank;
                        accountInFo.AccountTypeId = bank.TypeId;
                        var accountType = RB_AccountTypeRepository.GetEntity(bank.TypeId.Value);
                        accountInFo.AccountType = accountType?.IsPublic == 0 ? "对私" : "对公";
                    }
                }
                else if (TradeModel.Type == Common.Enum.Finance.BranchAccountEnum.Cash)
                {
                    var cash = CashList.Where(x => x.ID == TradeModel.AccountId).FirstOrDefault();
                    if (cash != null)
                    {
                        accountInFo.Alias = cash.Alias;
                        accountInFo.BankNo = "";
                        accountInFo.Type = Common.Enum.Finance.BranchAccountEnum.Cash;
                        accountInFo.AccountTypeId = cash.TypeId;
                        var accountType = RB_AccountTypeRepository.GetEntity(cash.TypeId.Value);
                        accountInFo.AccountType = accountType?.IsPublic == 0 ? "对私" : "对公";
                    }
                }
                else if (TradeModel.Type == Common.Enum.Finance.BranchAccountEnum.CashPool)
                {
                    var pool = CashPoolList.Where(x => x.ID == TradeModel.AccountId).FirstOrDefault();
                    if (pool != null)
                    {
                        accountInFo.Alias = pool.Alias;
                        accountInFo.BankNo = "";
                        accountInFo.Type = Common.Enum.Finance.BranchAccountEnum.CashPool;
                        accountInFo.AccountTypeId = pool.TypeId;
                        var accountType = RB_AccountTypeRepository.GetEntity(pool.TypeId.Value);
                        accountInFo.AccountType = accountType?.IsPublic == 0 ? "对私" : "对公";
                    }
                }
                else if (TradeModel.Type == Common.Enum.Finance.BranchAccountEnum.Platform)
                {
                    var platform = PlatformList.Where(x => x.ID == TradeModel.AccountId).FirstOrDefault();
                    if (platform != null)
                    {
                        accountInFo.Alias = platform.Alias;
                        accountInFo.BankNo = platform.PlatformNo;
                        accountInFo.Type = Common.Enum.Finance.BranchAccountEnum.Platform;
                        accountInFo.AccountTypeId = platform.TypeId;
                        var accountType = RB_AccountTypeRepository.GetEntity(platform.TypeId.Value);
                        accountInFo.AccountType = accountType?.IsPublic == 0 ? "对私" : "对公";
                    }
                }
                list.Add(accountInFo);
            }
            return list;
        }


        #region 营收报表+简易报表初始化

        /// <summary>
        /// 更新营收报表
        /// </summary>
        /// <param name="GroupId"></param>
        /// <param name="StartTime"></param>
        /// <param name="EndTime"></param>
        /// <returns></returns>
        public bool SetEduRevenueReport(int GroupId, string StartTime, bool IsUpdateHistory)
        {
            edu_UpdateRecordRepository.Insert(new RB_Report_UpdateRecord()
            {
                Type = 1,
                StartDate = DateTime.Now
            });
            string STime = "";string ETime = "";
            if (IsUpdateHistory == true)
            {
                //历史 往后倒退一年
                STime = Convert.ToDateTime(StartTime).AddYears(-1).ToString("yyyy-MM-dd");
                ETime = StartTime;
            }
            else {
                STime = StartTime;
                ETime = DateTime.Now.AddYears(1).ToString("yyyy-MM-dd");
            }

            //查询日期范围内所有的班级
            var classList = classRepository.GetClassAndCourseListRepository(new RB_Class_ViewModel() { Group_Id = GroupId, StartTime = STime, EndTime = ETime }).ToList();            
            List<RB_Order_ViewModel> orderAllList = new List<RB_Order_ViewModel>();
            List<RB_Finance_Extend> FAllList = new List<RB_Finance_Extend>();
            List<RB_Teaching_BonusDetail_ViewModel> teacherBonusList = new List<RB_Teaching_BonusDetail_ViewModel>();
            List<RB_Teaching_Perf_ViewModel> meritsProfitList = new List<RB_Teaching_Perf_ViewModel>();
            List<RB_Class_Check_ViewModel> classHoursList = new List<RB_Class_Check_ViewModel>();
            List<RB_Class_Check_ViewModel> classStuList = new List<RB_Class_Check_ViewModel>();
            List<RB_Sell_Achievements_Emp_ViewModel> AchDetailList = new List<RB_Sell_Achievements_Emp_ViewModel>();
            if (classList.Any())
            {
                string classIds = string.Join(",", classList.Select(x => x.ClassId));
                //根据班级查询所有的订单列表
                orderAllList = orderRepository.GetOrderListRepository(new RB_Order_ViewModel() { Group_Id = GroupId, ClassIds = classIds, OrderType = Common.Enum.Sale.OrderTypeEnum.CourseOrder, Q_OrderState = 1 });
                //查询班级下所有的财务单据
                FAllList = RB_FinanceRepository.GetDataStatisticsListThree(new RB_Finance_Extend() { RB_Group_Id = GroupId, TCIDStr = classIds, OrderSource = OrderResourceEnum.Education });
                teacherBonusList = teaching_BonusDetailRepository.GetList(new RB_Teaching_BonusDetail_ViewModel { Group_Id = GroupId, ClassIds = classIds, CouseClassify = 1 });
                meritsProfitList = teaching_PerfRepository.GetList(new RB_Teaching_Perf_ViewModel { Group_Id = GroupId, ClassIds = classIds });
                //查询班级下已上课时数量
                classHoursList = class_CheckRepository.GetClassLearnHoursList(GroupId, classIds);
                //查询班级下所有学生的上课金额
                classStuList = class_CheckRepository.GetClassStuLearnMoneyList(GroupId, classIds);
                #region 查询订单下所有的业绩提成
                if (orderAllList.Any())
                {
                    string orderIds = string.Join(",", orderAllList.Select(x => x.OrderId));
                    AchDetailList = sell_Achievements_EmpRepository.GetList(new RB_Sell_Achievements_Emp_ViewModel() { Group_Id = GroupId, OrderIds = orderIds });
                }
                #endregion
            }
            //排序取消/删除班级
            var oldlist = edu_RevenueReportRepository.GetList(new RB_Edu_RevenueReport_Extend() { StartTime = STime, EndTime = ETime, DateType = 1, Rb_Group_Id = GroupId });
            var delList = oldlist.Where(x => !classList.Select(y => y.ClassId).Contains(x.ClassId)).ToList();
            if (delList.Any())
            {
                edu_RevenueReportRepository.DeleteBatch(delList);
            }

            foreach (var item in classList) {
                try
                {
                    Console.WriteLine("班级:" + item.ClassName + "|" + item.ClassId);
                    bool IsNew = false;//是否新增
                    var orderList = orderAllList.Where(x => x.ClassId == item.ClassId).ToList();
                    var financeList = FAllList.Where(x => x.TCID == item.ClassId).ToList();
                    var demodel = oldlist.Where(x => x.ClassId == item.ClassId).FirstOrDefault();
                    if (demodel == null) {
                        IsNew = true;
                        //新增
                        demodel = new RB_Edu_RevenueReport_Extend()
                        {
                            Id = 0,
                            ClassId = item.ClassId,
                            Rb_Group_Id = GroupId,
                            SchoolId = item.School_Id,
                            SchoolName = item.SchoolName,
                            DateType = 1
                        };
                    }
                    #region 初始化数据
                    demodel.ClassBegins = item.OpenTime;
                    demodel.ClassName = item.ClassName;
                    demodel.ClassNo = item.ClassNo;
                    demodel.ClassState = (int)item.ClassStatus;
                    demodel.CourseId = item.CouseId;
                    demodel.CourseName = item.CourseName;
                    demodel.TeacherId = item.Teacher_Id;
                    demodel.TeacherName = item.TeacherName;
                    demodel.SchoolId = item.School_Id;
                    demodel.SchoolName = item.SchoolName;

                    demodel.HoursNum = item.ClassHours;
                    demodel.ConsumeNum = Convert.ToInt32(classHoursList.Where(x => x.ClassId == item.ClassId).FirstOrDefault()?.CurrentDeductionHours ?? 0);
                    demodel.ConsumeMoney = Math.Round(classStuList.Where(x => x.ClassId == item.ClassId).FirstOrDefault()?.UnitPrice ?? 0, 2, MidpointRounding.AwayFromZero);
                    #endregion

                    #region 统计数据
                    #region 订单
                    demodel.YingShou = orderList.Sum(x => x.PreferPrice);
                    demodel.ShiShou = orderList.Sum(x => x.Income);
                    demodel.TuiKuan = orderList.Sum(x => x.Refund);
                    demodel.PingTaiShuiJin = orderList.Sum(x => x.PlatformTax);
                    demodel.ZaiTu = 0;//暂时在途未做
                    demodel.YouHui = orderList.Sum(x => x.DiscountMoney);
                    demodel.DaiShou = (demodel.YingShou - demodel.ShiShou + demodel.TuiKuan - demodel.PingTaiShuiJin - demodel.YouHui);
                    demodel.YiShou = -demodel.DaiShou;
                    demodel.GuestNum = orderList.Sum(x => x.GuestNum);
                    #endregion
                    #region 财务单据
                    //排序订单单据
                    var cfinanceList = financeList.Where(x => x.OrderID == 0 && x.Type == WFTempLateClassEnum.IN).ToList();
                    demodel.QTShouRu = cfinanceList.Where(y => y.Is_Cashier == 1).Sum(x => x.Money ?? 0);
                    demodel.QTShouRu -= cfinanceList.Where(x => x.Is_Cashier == 1 && x.Fee > 0).GroupBy(x => new { x.FrID, x.Fee }).Sum(x => x.Key.Fee ?? 0);
                    //支出
                    demodel.TiCheng = orderList.Where(x => x.IsCommissionGive == 1).Sum(x => x.CommissionMoney + x.ExtraCommissionMoney);//销售提成
                    var achList = AchDetailList.Where(x => orderList.Select(x => x.OrderId).Contains(x.OrderId)).ToList();
                    if (achList.Any()) {
                        demodel.TiCheng += achList.Sum(x => x.GiveOutMoney);// 业绩提成
                    }
                    demodel.ClassFee = teacherBonusList.Where(x => x.ClassId == item.ClassId).Sum(x => x.Money);//老师提成
                    demodel.JiXiaoMoney = meritsProfitList.Where(x => x.ClassId == item.ClassId && x.PerfState == Common.Enum.Course.PerfStateEnum.Confirmed).OrderByDescending(x => x.CreateTime).FirstOrDefault()?.Money ?? 0;//绩效提成

                    var ofinanceList = financeList.Where(x => x.Type == WFTempLateClassEnum.OUT).ToList();// 支出包括退款
                    demodel.QTZhiChu = ofinanceList.Sum(x => x.Money ?? 0);
                    demodel.YingFu = demodel.QTZhiChu + demodel.TiCheng + demodel.ClassFee + demodel.JiXiaoMoney;
                    #endregion

                    demodel.MaoLi = demodel.ShiShou - demodel.YingFu;
                    demodel.ShiJiLiRun = demodel.MaoLi + demodel.QTShouRu;

                    //毛利率
                    if (demodel.ShiShou != 0)
                    {
                        demodel.MaoLiRate = Math.Round(demodel.MaoLi / demodel.ShiShou * 100, 2, MidpointRounding.AwayFromZero);
                    }
                    if (demodel.GuestNum > 0)
                    {
                        //平均收入=实收+自费收入+其他收入+佣金收入(属于佣金的所有)/参团+单团报入
                        demodel.AverageIncome = Math.Round((demodel.ShiShou + demodel.QTShouRu) / demodel.GuestNum, 2, MidpointRounding.AwayFromZero);
                        //平均成本=应付/参团+单团报入
                        demodel.AverageCost = Math.Round((demodel.YingFu / demodel.GuestNum), 2, MidpointRounding.AwayFromZero);
                    }
                    //平均利润=平均收入-平均成本
                    demodel.AverageProfit = demodel.AverageIncome - demodel.AverageCost;
                    #endregion

                    if (IsNew)
                    {
                        edu_RevenueReportRepository.Insert(demodel);
                    }
                    else {
                        edu_RevenueReportRepository.Update(demodel);
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine("班级:" + item.ClassName + "|" + item.ClassId + ",错误:" + ex.Message);
                    LogHelper.Write(ex, "SetEduRevenueReport");
                }
            }


            #region 留学就业
            //查询日期范围内所有的留学就业项目
            var saList = studyAbroadRepository.GetStudyAbroadListExtRepository(new Model.ViewModel.StudyAbroad.RB_StudyAbroad_ViewModel() { Group_Id = GroupId, School_Id = -1, SaleState = Common.Enum.Sale.SaleStateEnum.Sell, StartTime = STime, EndTime = ETime });
            if (saList.Any()) {
                string saIds = string.Join(",", saList.Select(x => x.Id));
                //根据班级查询所有的订单列表
                orderAllList = orderRepository.GetOrderListRepository(new RB_Order_ViewModel() { Group_Id = GroupId, SourceIds = saIds, OrderType = Common.Enum.Sale.OrderTypeEnum.StudyabroadOrder, Q_OrderState = 1 });
                //查询班级下所有的财务单据
                FAllList = RB_FinanceRepository.GetDataStatisticsListThree(new RB_Finance_Extend() { RB_Group_Id = GroupId, TCIDStr = saIds, OrderSource = OrderResourceEnum.EducationStudy });
            }
            //排除取消/删除项目
            oldlist = edu_RevenueReportRepository.GetList(new RB_Edu_RevenueReport_Extend() { StartTime = STime, EndTime = ETime, IsSelectStuAbroad = 1, Rb_Group_Id = GroupId });
            delList = oldlist.Where(x => !saList.Select(y => y.Id).Contains(x.ClassId)).ToList();
            if (delList.Any())
            {
                edu_RevenueReportRepository.DeleteBatch(delList);
            }

            foreach (var item in saList) {
                try
                {
                    Console.WriteLine("留学就业:" + item.Name + "|" + item.Id);
                    bool IsNew = false;//是否新增
                    var orderList = orderAllList.Where(x => x.SourceId == item.Id).ToList();
                    var financeList = FAllList.Where(x => x.TCID == item.Id).ToList();
                    var demodel = oldlist.Where(x => x.ClassId == item.Id).FirstOrDefault();
                    if (demodel == null)
                    {
                        IsNew = true;
                        //新增
                        demodel = new RB_Edu_RevenueReport_Extend()
                        {
                            Id = 0,
                            ClassId = item.Id,
                            Rb_Group_Id = GroupId,
                            SchoolId = item.School_Id,
                            SchoolName = item.SchoolName,
                            DateType = item.Type == 1 ? 2 : 3
                        };
                    }
                    #region 初始化数据
                    demodel.ClassBegins = item.CreateTime;
                    demodel.ClassName = item.Name;
                    demodel.ClassState = 0;
                    demodel.CourseId = 0;
                    demodel.CourseName = item.SupplierName;
                    demodel.TeacherId = 0;
                    demodel.TeacherName = item.Type == 1 ? "留学" : "就业";
                    demodel.SchoolId = item.School_Id;
                    demodel.SchoolName = item.SchoolName;
                    #endregion

                    #region 统计数据
                    #region 订单
                    demodel.YingShou = orderList.Sum(x => x.PreferPrice);
                    demodel.ShiShou = orderList.Sum(x => x.Income);
                    demodel.TuiKuan = orderList.Sum(x => x.Refund);
                    demodel.PingTaiShuiJin = orderList.Sum(x => x.PlatformTax);
                    demodel.ZaiTu = 0;//暂时在途未做
                    demodel.YouHui = orderList.Sum(x => x.DiscountMoney);
                    demodel.DaiShou = (demodel.YingShou - demodel.ShiShou + demodel.TuiKuan - demodel.PingTaiShuiJin - demodel.YouHui);
                    demodel.YiShou = -demodel.DaiShou;
                    demodel.GuestNum = orderList.Sum(x => x.GuestNum);
                    #endregion
                    #region 财务单据
                    //排序订单单据
                    var cfinanceList = financeList.Where(x => x.OrderID == 0 && x.Type == WFTempLateClassEnum.IN).ToList();
                    demodel.QTShouRu = cfinanceList.Where(y => y.Is_Cashier == 1).Sum(x => x.Money ?? 0);
                    demodel.QTShouRu -= cfinanceList.Where(x => x.Is_Cashier == 1 && x.Fee > 0).GroupBy(x => new { x.FrID, x.Fee }).Sum(x => x.Key.Fee ?? 0);
                    //支出
                    demodel.TiCheng = (orderList != null && orderList.Any()) ? orderList.Where(x => x.IsCommissionGive == 1).Sum(x => x.CommissionMoney + x.ExtraCommissionMoney) : 0;//销售提成   -留学提成暂定
                    demodel.ClassFee = 0;//老师提成   -留学暂定
                    demodel.JiXiaoMoney = 0;//绩效提成   -留学暂定

                    var ofinanceList = financeList.Where(x => x.Type == WFTempLateClassEnum.OUT).ToList();// 支出包括退款
                    demodel.QTZhiChu = ofinanceList.Sum(x => x.Money ?? 0);
                    demodel.YingFu = demodel.QTZhiChu + demodel.TiCheng + demodel.ClassFee + demodel.JiXiaoMoney;
                    #endregion

                    demodel.MaoLi = demodel.ShiShou - demodel.YingFu;
                    demodel.ShiJiLiRun = demodel.MaoLi + demodel.QTShouRu;

                    //毛利率
                    if (demodel.ShiShou != 0)
                    {
                        demodel.MaoLiRate = Math.Round(demodel.MaoLi / demodel.ShiShou * 100, 2, MidpointRounding.AwayFromZero);
                    }
                    if (demodel.GuestNum > 0)
                    {
                        //平均收入=实收+自费收入+其他收入+佣金收入(属于佣金的所有)/参团+单团报入
                        demodel.AverageIncome = Math.Round((demodel.ShiShou + demodel.QTShouRu) / demodel.GuestNum, 2, MidpointRounding.AwayFromZero);
                        //平均成本=应付/参团+单团报入
                        demodel.AverageCost = Math.Round((demodel.YingFu / demodel.GuestNum), 2, MidpointRounding.AwayFromZero);
                    }
                    //平均利润=平均收入-平均成本
                    demodel.AverageProfit = demodel.AverageIncome - demodel.AverageCost;
                    #endregion

                    if (IsNew)
                    {
                        edu_RevenueReportRepository.Insert(demodel);
                    }
                    else
                    {
                        edu_RevenueReportRepository.Update(demodel);
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine("留学就业:" + item.Name + "|" + item.Id + ",错误:" + ex.Message);
                    LogHelper.Write(ex, "SetEduRevenueReport");
                }
            }
            #endregion

            #region 试听课程

            var rclist = reserve_ClassRepository.GetReserveClassListRepository(new Model.ViewModel.Reserve.RB_Reserve_Class_Extend() { Group_Id = GroupId, StartClassDate = STime, EndClassDate = ETime });
            if (rclist.Any()) {
                string rclassIds = string.Join(",", rclist.Select(x => x.ReserveClassId));
                //查询班级下所有的财务单据
                FAllList = RB_FinanceRepository.GetDataStatisticsListThree(new RB_Finance_Extend() { RB_Group_Id = GroupId, TCIDStr = rclassIds, OrderSource = OrderResourceEnum.ReserveClass });
            }


            #endregion

            var fumodel = edu_UpdateRecordRepository.GetList(new RB_Report_UpdateRecord() { Type = 1 }).FirstOrDefault();
            if (fumodel != null)
            {
                fumodel.EndDate = DateTime.Now;
                edu_UpdateRecordRepository.Update(fumodel);
            }
            return true;
        }

        /// <summary>
        /// 获取营收报表分页列表
        /// </summary>
        /// <param name="pageIndex"></param>
        /// <param name="pageSize"></param>
        /// <param name="count"></param>
        /// <param name="dmodel"></param>
        /// <returns></returns>
        public List<RB_Edu_RevenueReport_Extend> GetRevenueReportPageList(int pageIndex, int pageSize, out long count, RB_Edu_RevenueReport_Extend dmodel)
        {
            var list = edu_RevenueReportRepository.GetPageList(pageIndex, pageSize, out count, dmodel);
            //统计
            var Statistics = edu_RevenueReportRepository.GetRevenueReportStatistics(dmodel);
            if (count > 0) {
                Statistics.MaoLiRate = Math.Round(Statistics.MaoLiRate / count, 2, MidpointRounding.AwayFromZero);
                Statistics.AverageIncome = Math.Round(Statistics.AverageIncome / count, 2, MidpointRounding.AwayFromZero);
                Statistics.AverageCost = Math.Round(Statistics.AverageCost / count, 2, MidpointRounding.AwayFromZero);
                Statistics.AverageProfit = Math.Round(Statistics.AverageProfit / count, 2, MidpointRounding.AwayFromZero);
            }
            list.Add(Statistics);
            return list;
        }

        /// <summary>
        /// 获取最新记录
        /// </summary>
        /// <returns></returns>
        public RB_Report_UpdateRecord GetUpdateRecordNew()
        {
            return edu_UpdateRecordRepository.GetList(new RB_Report_UpdateRecord() { Type = 1 }).FirstOrDefault();
        }

        /// <summary>
        /// 更新简易报表
        /// </summary>
        /// <param name="GroupId"></param>
        /// <param name="Year"></param>
        /// <returns></returns>
        public bool InsertBatchSimple(int GroupId, int Year)
        {
            edu_UpdateRecordRepository.Insert(new RB_Report_UpdateRecord()
            {
                Type = 2,
                StartDate = DateTime.Now
            });
            try
            {
                string sDate = Year + "-01-01";
                string eDate = DateTime.Now.AddYears(1).AddDays(-1).ToString("yyyy-MM-dd");
                int i = 1;
                string FYLX = "营业总收入,其他收入,待收金额,退款金额,平台税金,优惠金额,营业总成本,营业总毛利,工资,员工提成,社保,员工福利及竞赛奖金,办公用品,差旅费,电话费(通訊費),快递费,物管水电费,房租,广告费,业务招待,税金,平台使用费,電腦系统费,市内交通费,团队建设费,会务费,工会经费,律师费,服务器管理费,汇款手续费,其他,管销费用,利息收入,汇兑损益,财务费用,营业外收入,其他营业支出,营业利润(亏损),所得税费用,净利润(亏损),以下项均不计入计算,股东权益(投资款),股东权益(利润分配),股东权益(员工红利),小计1,预付款(教育),预付款(保证金.押金),小计2,备用金,个人借款,其他代垫代收,陈芳英款项,小计3";
                string RZFYLX = "营业总收入,其他收入,待收金额,退款金额,平台税金,优惠金额,营业总成本,营业总毛利,营业利润(亏损),净利润(亏损)";
                var FYLXList = new List<string>(FYLX.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries));
                var RZFYLXList = new List<string>(RZFYLX.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries));
                //财务单据
                var RZFinancelist = RB_FinanceRepository.GetListForReport(new RB_Finance_Extend() { sAduitDate = DateTime.Parse(sDate), eAduitDate = DateTime.Now.AddYears(1).AddDays(-1), RB_Branch_Id = -1, RB_Group_Id = GroupId, Is_TCID = 1, TCID = -1, FinanceType = 2 });
                //获取资金调拨单据
                var CapitalAllocationFinanceList = RB_FinanceRepository.GetTradeWayForCapitalAllocation(new RB_Finance_Extend() { sAduitDate = DateTime.Parse(sDate), eAduitDate = DateTime.Now.AddYears(1).AddDays(-1), RB_Branch_Id = -1, RB_Group_Id = GroupId, Is_TCID = 1, TCID = -1 });
                //营收报表数据
                var YSBBList = edu_RevenueReportRepository.GetList(new RB_Edu_RevenueReport_Extend() { DateType = 0, StartTime = sDate, EndTime = eDate, Rb_Group_Id = GroupId });
                //历史简易
                var oldlist = edu_simpleReportRepository.GetList(new RB_SimpleReport_Extend() { Year = Year, Rb_Group_Id = GroupId });
                //查询校区
                var schoolList = schoolRepository.GetSchoolListRepository(new Model.ViewModel.User.RB_School_ViewModel() { Group_Id = GroupId });
                List<string> shareList = new List<string>() { "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12" };
                foreach (var branchitem in schoolList)
                {
                    var srList = oldlist.Where(x => x.BranchId == branchitem.SId).ToList();
                    edu_simpleReportRepository.DeleteBatch(srList);
                    foreach (var ditem in FYLXList)
                    {
                        RB_SimpleReport ousimpleReport = new RB_SimpleReport();
                        decimal January = 0, February = 0, March = 0, April = 0, May = 0, June = 0, July = 0, August = 0, September = 0, October = 0, November = 0, December = 0;

                        foreach (var item in shareList)
                        {
                            sDate = Convert.ToDateTime(Year + "-" + item + "-01").ToString("yyyy-MM-dd");
                            eDate = DateTime.Parse((Year + "-" + item + "-01")).AddMonths(1).AddDays(-1).ToString("yyyy-MM-dd");
                            #region 营业总收入,佣金收入,待收金额,退款金额,平台税金,联运成本,营业总成本,联运营业额支出
                            decimal YSJE = 0, YYZSR = 0, DSJE = 0, TKJE = 0, PJSJ = 0, YouHui = 0, YYZCB = 0, QTShouRu = 0;



                            var financelist = new List<RB_Finance_Extend>();

                            var NowYSBBList = YSBBList.Where(x => x.SchoolId == branchitem.SId && x.ClassBegins.ToString("yyyy-MM") == Convert.ToDateTime(sDate).ToString("yyyy-MM")).ToList();
                            if (RZFYLXList.Contains(ditem))
                            {
                                YSJE = NowYSBBList.Sum(x => x.YingShou);
                                YYZSR = NowYSBBList.Sum(x => x.ShiShou);
                                TKJE = NowYSBBList.Sum(x => x.TuiKuan);
                                PJSJ = NowYSBBList.Sum(x => x.PingTaiShuiJin);
                                YouHui = NowYSBBList.Sum(x => x.YouHui);
                                //待收金额=应收-已收-凭条税金-在途金额+退款+问题账户;
                                DSJE = YSJE - YYZSR - PJSJ + TKJE - YouHui;
                                YYZCB = NowYSBBList.Sum(x => x.YingFu);
                                QTShouRu = NowYSBBList.Sum(x => x.QTShouRu);
                            }
                            #endregion

                            #region 日常费用类
                            decimal GXFY = 0;//管销费用
                            decimal YYZML = 0;//营业总毛利=(营业总收入+退款总金额-待收金额-平台税金-在途金额(这个是营收报表的实收))-营业总成本(营收报表的应付)+佣金总收入+自费收入-联运成本-旅游意外保险
                            var Financelist = RZFinancelist.Where(x => ((x.Type == WFTempLateClassEnum.OUT && x.CreateDate.Value.ToString("yyyy-MM") == Convert.ToDateTime(sDate).ToString("yyyy-MM")) || (x.Type != WFTempLateClassEnum.OUT && x.TradeDate.Value.ToString("yyyy-MM") == Convert.ToDateTime(sDate).ToString("yyyy-MM"))) && x.RB_Branch_Id == branchitem.SId).ToList();

                            YYZML = NowYSBBList.Sum(x => x.ShiJiLiRun);

                            decimal GZ = 0;//工资
                            decimal YGTC = 0;//员工提成
                            decimal SB = 0;//社保
                            decimal YGFL = 0;//员工福利及竞赛奖金
                            decimal BGYP = 0;//办公用品
                            decimal CLF = 0;//差旅费
                            decimal TEL = 0;//电话费
                            decimal KDF = 0;//快递费
                            decimal WGSDF = 0;//物管水电费
                            decimal FZ = 0;//房租
                            decimal GGF = 0;//广告费
                            decimal YWZD = 0;//业务招待
                            decimal LJZK = 0;//累计折扣
                            decimal Sj = 0;//税金
                            decimal PTSYF = 0;//平台使用费
                            decimal DNSYF = 0;//电脑使用费
                            decimal SNJTF = 0;//市内交通费
                            decimal TJF = 0;//团建费
                            decimal HWF = 0;//会务费
                            decimal GHJF = 0;//工会经费
                            decimal LSF = 0;//律师费
                            decimal FWQGLF = 0;//服务器管理员费
                            decimal HKSXF = 0;//汇款手续费
                            decimal JYQT = 0;//其他
                            decimal LXSR = 0;//利息收入
                            decimal HDSY = 0;//汇兑损益
                            decimal CWFY = 0;//财务费用=利息收入-汇兑损益
                            decimal YYWSR1 = 0;//营业外收入1
                                               //decimal YYWSR2 = 0;//营业外收入2(领队)
                                               //decimal QTYYSR = 0;//其他营业收入
                            decimal YYWSR = 0;//营业外收入=营业外收入+营业外收入1,更正:营业外收入=营业外收入1+营业外收入2(领队)+其他营业收入;
                                              //YYWSR = GetCostIds(44, Financelist, true) + YYWSR1;
                            YYWSR = YYWSR1;//更正:营业外收入=营业外收入1
                            decimal QTYYZC = 0;//其他营业支出
                            decimal YSYF = 0;//应收应付
                                             //decimal YSYFTZ = 0;//应收应付投资
                            decimal YYLRKS = 0;//营业利润亏损=营业总毛利-分摊金额-营业税金及附加-管销费用+财务费用+营业外收入-其他营业支出-应收应付款
                            YYLRKS = YYZML - GXFY + CWFY + YYWSR - QTYYZC - YSYF;
                            decimal SDSFY = 0;//所得税费用
                            decimal JLRKS = 0;//净利润亏损=营业利润+所得税费用,更正:净利润(亏损)=营业利润(亏损)-所得税费用
                            #endregion

                            #region 资金调拨汇兑损益
                            decimal ZJTBHDSYMoney = 0;
                            if (ditem == "汇兑损益" || ditem == "财务费用" || ditem == "营业利润(亏损)" || ditem == "净利润(亏损)")
                            {
                                var calist = CapitalAllocationFinanceList.Where(x => x.AllotDate.Value.ToString("yyyy-MM") == Convert.ToDateTime(sDate).ToString("yyyy-MM") && x.BranchId == branchitem.SId).ToList();
                                //资金调拨的汇兑损益
                                decimal iMoney = calist.Where(x => x.AllotType == 1)?.Sum(x => x.Money ?? 0) ?? 0;
                                decimal oMoney = calist.Where(x => x.AllotType == 2)?.Sum(x => x.Money ?? 0) ?? 0;
                                ZJTBHDSYMoney = oMoney - iMoney;
                            }
                            #endregion
                            #region 赋值
                            decimal Money = 0;
                            if (ditem == "营业总收入")
                            {
                                Money = YSJE;
                            }
                            else if (ditem == "其他收入")
                            {
                                Money = QTShouRu;
                            }
                            else if (ditem == "待收金额")
                            {
                                Money = DSJE;
                            }
                            if (ditem == "平台税金")
                            {
                                Money = PJSJ;
                            }
                            else if (ditem == "退款金额")
                            {
                                Money = TKJE;
                            }
                            else if (ditem == "优惠金额")
                            {
                                Money = YouHui;
                            }
                            else if (ditem == "营业总成本")
                            {
                                Money = YYZCB;
                            }
                            else if (ditem == "营业总毛利")
                            {
                                Money = YYZML;
                            }
                            else if (ditem == "工资")
                            {
                                GZ = GetCostIds(15, Financelist, false, 1, true);
                                Money = GZ;
                            }
                            else if (ditem == "员工提成")
                            {
                                YGTC = GetCostIds(16, Financelist, false, 1, true);
                                Money = YGTC;
                            }
                            else if (ditem == "社保")
                            {
                                SB = GetCostIds(17, Financelist, false, 1, true);
                                Money = SB;
                            }
                            else if (ditem == "员工福利及竞赛奖金")
                            {
                                YGFL = GetCostIds(18, Financelist, false, 1, true);
                                Money = YGFL;
                            }
                            else if (ditem == "办公用品")
                            {
                                BGYP = GetCostIds(19, Financelist, false, 1, true);
                                Money = BGYP;
                            }
                            else if (ditem == "差旅费")
                            {
                                CLF = GetCostIds(20, Financelist, false, 1, true);
                                Money = CLF;
                            }
                            else if (ditem == "电话费(通訊費)")
                            {
                                TEL = GetCostIds(21, Financelist, false, 1, true);
                                Money = TEL;
                            }
                            else if (ditem == "快递费")
                            {
                                KDF = GetCostIds(52, Financelist, false, 1, true);
                                Money = KDF;
                            }
                            else if (ditem == "物管水电费")
                            {
                                WGSDF = GetCostIds(22, Financelist, false, 1, true);
                                Money = WGSDF;
                            }
                            else if (ditem == "房租")
                            {
                                FZ = GetCostIds(23, Financelist, false, 1, true);
                                Money = FZ;
                            }
                            else if (ditem == "广告费")
                            {
                                GGF = GetCostIds(24, Financelist, false, 1, true);
                                Money = GGF;
                            }
                            else if (ditem == "业务招待")
                            {
                                YWZD = GetCostIds(25, Financelist, false, 1, true);
                                Money = YWZD;
                            }
                            else if (ditem == "累计折旧")
                            {
                                LJZK = GetCostIds(26, Financelist, false, 1, true);
                                Money = LJZK;
                            }
                            else if (ditem == "税金")
                            {
                                Sj = GetCostIds(27, Financelist, false, 1, true);
                                Money = Sj;
                            }
                            else if (ditem == "平台使用费")
                            {
                                PTSYF = GetCostIds(28, Financelist, false, 1, true);
                                Money = PTSYF;
                            }
                            else if (ditem == "電腦系统费")
                            {
                                DNSYF = GetCostIds(29, Financelist, false, 1, true);
                                Money = DNSYF;
                            }
                            else if (ditem == "市内交通费")
                            {
                                SNJTF = GetCostIds(30, Financelist, false, 1, true);
                                Money = SNJTF;
                            }
                            else if (ditem == "团队建设费")
                            {
                                TJF = GetCostIds(31, Financelist, false, 1, true);
                                Money = TJF;
                            }
                            else if (ditem == "会务费")
                            {
                                HWF = GetCostIds(32, Financelist, false, 1, true);
                                Money = HWF;
                            }
                            else if (ditem == "工会经费")
                            {
                                GHJF = GetCostIds(34, Financelist, false, 1, true);
                                Money = GHJF;
                            }
                            else if (ditem == "律师费")
                            {
                                LSF = GetCostIds(35, Financelist, false, 1, true);
                                Money = LSF;
                            }
                            else if (ditem == "服务器管理费")
                            {
                                FWQGLF = GetCostIds(36, Financelist, false, 1, true);
                                Money = FWQGLF;
                            }
                            else if (ditem == "汇款手续费")
                            {
                                HKSXF = GetCostIds(41, Financelist, false, 1, true);
                                Money = HKSXF;
                            }
                            else if (ditem == "其他")
                            {
                                JYQT = GetCostIds(51, Financelist, false, 1, true);
                                Money = JYQT;
                            }
                            else if (ditem == "管销费用")
                            {
                                GXFY = GetGXFY(Financelist);
                                Money = GXFY;
                            }
                            else if (ditem == "利息收入")
                            {
                                LXSR = GetCostIds(42, Financelist, false, 1, true);
                                Money = -LXSR;
                            }
                            else if (ditem == "汇兑损益")
                            {
                                HDSY = GetCostIds(43, Financelist, false, 1, true);
                                Money = HDSY + ZJTBHDSYMoney;
                            }
                            else if (ditem == "财务费用")
                            {
                                //财务费用=利息收入-汇兑损益
                                CWFY = -GetCostIds(42, Financelist, false, 1, true) - GetCostIds(43, Financelist, false, 1, true) - ZJTBHDSYMoney;
                                Money = CWFY;
                            }
                            else if (ditem == "营业外收入")
                            {
                                Money = GetCostIds(44, Financelist, true, 1);
                            }
                            else if (ditem == "其他营业支出")
                            {
                                Money = GetCostIds(48, Financelist, false, 1);
                            }
                            else if (ditem == "应收应付款")
                            {
                                //应收应付款=出纳审核过的收款单之和-所有应付款
                                decimal YS = GetCostIds(55, Financelist, true, 1);
                                decimal YF = GetCostIds(56, Financelist, false, 1);
                                Money = YF - YS;
                            }
                            else if (ditem == "营业利润(亏损)")
                            {
                                decimal yywsrMoney = GetCostIds(44, Financelist, true, 1);
                                decimal yywzcMoney = GetCostIds(48, Financelist, false, 1);

                                //营业利润亏损 = 营业总毛利 - 分摊金额 - 管销费用 + 财务费用 + 营业外收入 - 其他营业支出 - 应收应付款(应收-应付)
                                Money = YYZML - GetGXFY(Financelist) + (-GetCostIds(42, Financelist, false, 1, true) - GetCostIds(43, Financelist, false, 1, true)) - ZJTBHDSYMoney + yywsrMoney - yywzcMoney - (GetCostIds(56, Financelist, true, 1) - GetCostIds(55, Financelist, false, 1));
                            }
                            else if (ditem == "所得税费用")
                            {
                                SDSFY = GetCostIds(49, Financelist, false, 1, true);
                                Money = SDSFY;
                            }
                            else if (ditem == "净利润(亏损)")
                            {
                                decimal yywsrMoney = GetCostIds(44, Financelist, true, 1);
                                decimal yywzcMoney = GetCostIds(48, Financelist, false, 1);
                                //净利润亏损=营业利润+所得税费用,更正:净利润(亏损)=营业利润(亏损)-所得税费用
                                JLRKS = YYZML - GetGXFY(Financelist) + (-GetCostIds(42, Financelist, false, 1, true) - GetCostIds(43, Financelist, false, 1, true)) - ZJTBHDSYMoney + yywsrMoney - yywzcMoney - (GetCostIds(56, Financelist, true, 1) - GetCostIds(55, Financelist, false, 1)) - GetCostIds(49, Financelist, false, 1, true);
                                Money = JLRKS;
                            }
                            else if (ditem == "股东权益(投资款)")
                            {
                                //应收应付款=出纳审核过的收款单之和-所有应付款
                                decimal YS = GetCostIds(58, Financelist, true, 1);
                                decimal YF = GetCostIds(59, Financelist, false, 1);
                                Money = YS - YF;
                            }
                            else if (ditem == "股东权益(利润分配)")
                            {
                                decimal YS = GetCostIds(61, Financelist, true, 1);
                                decimal YF = GetCostIds(62, Financelist, false, 1);
                                Money = YS - YF;
                            }
                            else if (ditem == "股东权益(员工红利)")
                            {
                                decimal YS = GetCostIds(63, Financelist, true, 1);
                                decimal YF = GetCostIds(64, Financelist, false, 1);
                                Money = YS - YF;
                            }
                            else if (ditem == "预付款(教育)")
                            {
                                decimal YS = GetCostIds(73, Financelist, true, 1);
                                decimal YF = GetCostIds(74, Financelist, false, 1);
                                Money = YS - YF;
                            }
                            else if (ditem == "预付款(保证金.押金)")
                            {
                                decimal YS = GetCostIds(75, Financelist, true, 1);
                                decimal YF = GetCostIds(76, Financelist, false, 1);
                                Money = YS - YF;
                            }
                            else if (ditem == "备用金")
                            {
                                decimal YS = GetCostIds(81, Financelist, true, 1);
                                decimal YF = GetCostIds(82, Financelist, false, 1);
                                Money = YS - YF;
                            }
                            else if (ditem == "个人借款")
                            {
                                decimal YS = GetCostIds(83, Financelist, true, 1);
                                decimal YF = GetCostIds(84, Financelist, false, 1);
                                Money = YS - YF;
                            }
                            else if (ditem == "其他代垫代收")
                            {
                                decimal YS = GetCostIds(85, Financelist, true, 1);
                                decimal YF = GetCostIds(86, Financelist, false, 1);
                                Money = YS - YF;
                            }
                            else if (ditem == "陈芳英款项")
                            {
                                decimal YS = GetCostIds(87, Financelist, true, 1);
                                decimal YF = GetCostIds(88, Financelist, false, 1);
                                Money = YS - YF;
                            }
                            else if (ditem == "小计1")
                            {
                                //投资款
                                decimal YS = GetCostIds(58, Financelist, true, 1);
                                decimal YF = GetCostIds(59, Financelist, false, 1);
                                Money = YS - YF;
                                //利润分配
                                YS = GetCostIds(61, Financelist, true, 1);
                                YF = GetCostIds(62, Financelist, false, 1);
                                Money += YS - YF;
                                //员工红利
                                YS = GetCostIds(63, Financelist, true, 1);
                                YF = GetCostIds(64, Financelist, false, 1);
                                Money += YS - YF;
                            }
                            else if (ditem == "小计2")
                            {
                                //预付款(教育)
                                decimal YS = GetCostIds(73, Financelist, true, 1);
                                decimal YF = GetCostIds(74, Financelist, false, 1);
                                Money += YS - YF;
                                //预付款(保证金.押金)
                                YS = GetCostIds(75, Financelist, true, 1);
                                YF = GetCostIds(76, Financelist, false, 1);
                                Money += YS - YF;
                            }
                            else if (ditem == "小计3")
                            {
                                //备用金
                                decimal YS = GetCostIds(81, Financelist, true, 1);
                                decimal YF = GetCostIds(82, Financelist, false, 1);
                                Money = YS - YF;
                                //个人借款
                                YS = GetCostIds(83, Financelist, true, 1);
                                YF = GetCostIds(84, Financelist, false, 1);
                                Money += YS - YF;
                                //其他代垫代收
                                YS = GetCostIds(85, Financelist, true, 1);
                                YF = GetCostIds(86, Financelist, false, 1);
                                Money += YS - YF;
                                //陈芳英款项
                                YS = GetCostIds(87, Financelist, true, 1);
                                YF = GetCostIds(88, Financelist, false, 1);
                                Money += YS - YF;
                            }
                            else if (ditem == "以下项均不计入计算")
                            {
                                Money = 0;
                            }

                            if (item == "01")
                            {
                                January = Money;
                            }
                            else if (item == "02")
                            {
                                February = Money;
                            }
                            else if (item == "03")
                            {
                                March = Money;
                            }
                            else if (item == "04")
                            {
                                April = Money;
                            }
                            else if (item == "05")
                            {
                                May = Money;
                            }
                            else if (item == "06")
                            {
                                June = Money;
                            }
                            else if (item == "07")
                            {
                                July = Money;
                            }
                            else if (item == "08")
                            {
                                August = Money;
                            }
                            else if (item == "09")
                            {
                                September = Money;
                            }
                            else if (item == "10")
                            {
                                October = Money;
                            }
                            else if (item == "11")
                            {
                                November = Money;
                            }
                            else if (item == "12")
                            {
                                December = Money;
                            }

                            #endregion

                            Console.WriteLine(branchitem.SName + ":" + Year + "年" + item + "月" + "费用名称:" + ditem + "金额:" + Money);
                        }

                        var simpleReport = new RB_SimpleReport()
                        {
                            Year = Year,
                            Abstract = ditem,
                            January = January,
                            February = February,
                            March = March,
                            FirstQuarter = January + February + March,
                            April = April,
                            May = May,
                            June = June,
                            SecondQuarter = April + May + June,
                            HalfReport = January + February + March + April + May + June,
                            July = July,
                            August = August,
                            September = September,
                            ThirdQuarter = July + August + September,
                            October = October,
                            November = November,
                            December = December,
                            FourthQuarter = October + November + December,
                            LastHalfReport = July + August + September + October + November + December,
                            Total = January + February + March + April + May + June + July + August + September + October + November + December,
                            Sort = i,
                            Rb_Group_Id = GroupId,
                            BranchId = branchitem.SId
                        };
                        i++;
                        edu_simpleReportRepository.Insert(simpleReport);
                    }
                }

                int j = 1;
                var oldALLlist = edu_simpleReportRepository.GetList(new RB_SimpleReport_Extend() { Year = Year, Rb_Group_Id = GroupId, BranchId = -1 });
                edu_simpleReportRepository.DeleteBatch(oldALLlist);
                foreach (var FYLXitem in FYLXList)
                {
                    //汇总
                    var simpleReportList = edu_simpleReportRepository.GetList(new RB_SimpleReport_Extend() { Year = Year, Abstract = FYLXitem, Rb_Group_Id = GroupId }).Where(x => x.BranchId > -1).ToList();
                    var simpleReport = new RB_SimpleReport
                    {
                        Year = Year,
                        Abstract = FYLXitem.ToString(),
                        January = simpleReportList.Where(x => x.Abstract == FYLXitem.ToString()).Sum(x => x.January),
                        February = simpleReportList.Where(x => x.Abstract == FYLXitem.ToString()).Sum(x => x.February),
                        March = simpleReportList.Where(x => x.Abstract == FYLXitem.ToString()).Sum(x => x.March),
                        FirstQuarter = simpleReportList.Where(x => x.Abstract == FYLXitem.ToString()).Sum(x => x.FirstQuarter),
                        April = simpleReportList.Where(x => x.Abstract == FYLXitem.ToString()).Sum(x => x.April),
                        May = simpleReportList.Where(x => x.Abstract == FYLXitem.ToString()).Sum(x => x.May),
                        June = simpleReportList.Where(x => x.Abstract == FYLXitem.ToString()).Sum(x => x.June),
                        SecondQuarter = simpleReportList.Where(x => x.Abstract == FYLXitem.ToString()).Sum(x => x.SecondQuarter),
                        HalfReport = simpleReportList.Where(x => x.Abstract == FYLXitem.ToString()).Sum(x => x.HalfReport),
                        July = simpleReportList.Where(x => x.Abstract == FYLXitem.ToString()).Sum(x => x.July),
                        August = simpleReportList.Where(x => x.Abstract == FYLXitem.ToString()).Sum(x => x.August),
                        September = simpleReportList.Where(x => x.Abstract == FYLXitem.ToString()).Sum(x => x.September),
                        ThirdQuarter = simpleReportList.Where(x => x.Abstract == FYLXitem.ToString()).Sum(x => x.ThirdQuarter),
                        October = simpleReportList.Where(x => x.Abstract == FYLXitem.ToString()).Sum(x => x.October),
                        November = simpleReportList.Where(x => x.Abstract == FYLXitem.ToString()).Sum(x => x.November),
                        December = simpleReportList.Where(x => x.Abstract == FYLXitem.ToString()).Sum(x => x.December),
                        FourthQuarter = simpleReportList.Where(x => x.Abstract == FYLXitem.ToString()).Sum(x => x.FourthQuarter),
                        LastHalfReport = simpleReportList.Where(x => x.Abstract == FYLXitem.ToString()).Sum(x => x.LastHalfReport),
                        Total = simpleReportList.Where(x => x.Abstract == FYLXitem.ToString()).Sum(x => x.Total),
                        Sort = j,
                        Rb_Group_Id = GroupId,
                        BranchId = -1
                    };
                    j++;
                    Console.WriteLine("总计:" + FYLXitem + "金额:" + simpleReportList.Where(x => x.Abstract == FYLXitem.ToString()).Sum(x => x.January));
                    edu_simpleReportRepository.Insert(simpleReport);
                }

                var fumodel = edu_UpdateRecordRepository.GetList(new RB_Report_UpdateRecord() { Type = 2 }).FirstOrDefault();
                if (fumodel != null)
                {
                    fumodel.EndDate = DateTime.Now;
                    edu_UpdateRecordRepository.Update(fumodel);
                }
                return true;

            }
            catch (Exception ex)
            {
                LogHelper.Write(ex, "InsertBatchSimple");
            }
            return true;
        }

        /// <summary>
        /// 新版本更新简易报表
        /// </summary>
        /// <param name="GroupId"></param>
        /// <param name="Year"></param>
        /// <returns></returns>
        public bool InsertBatchSimple_V2(int GroupId, int Year)
        {
            edu_UpdateRecordRepository.Insert(new RB_Report_UpdateRecord()
            {
                Type = 2,
                StartDate = DateTime.Now
            });
            try
            {
                string sDate = Year + "-01-01";
                string eDate = DateTime.Now.AddYears(1).AddDays(-1).ToString("yyyy-MM-dd");
                #region 查询费用
                var ctList = costtypeRepository.GetList(new RB_Costtype_Extend() { RB_Group_Id = GroupId });
                //查询出分组的费用
                List<int> groupList = ctList.Where(x => x.ReportType > 0).Select(x => x.ID).ToList();
                //再查询出该下面 所有最下级的费用 需是进入报表统计的
                List<ReportGroupModel> RGList = new List<ReportGroupModel>();
                foreach (var item in groupList)
                {
                    var nmodel = ctList.Where(x => x.ID == item).FirstOrDefault();
                    ReportGroupModel rgModel = new ReportGroupModel()
                    {
                        CostTypeId = item,
                        Name = nmodel.Name,
                        ReportType = nmodel.ReportType,
                        IncomeType = nmodel.Name.Contains("收入") ? 1 : 2,
                        Sort = nmodel.Sort ?? 0,
                        ChildList = new List<ReportChildModel>()
                    };
                    var qlist = ctList.Where(x => x.Is_Report == 1 && x.ParentId == item).ToList();
                    foreach (var qitem in qlist)
                    {
                        var qctList = ctList.Where(x => x.Is_Report == 1 && x.ParentId == qitem.ID).ToList();
                        if (qctList.Any())
                        {
                            rgModel.ChildList.AddRange(qctList.Select(x => new ReportChildModel()
                            {
                                CostTypeId = x.ID,
                                Name = x.Name,
                                Sort = x.Sort ?? 0
                            }));
                        }
                        else
                        {
                            rgModel.ChildList.Add(new ReportChildModel()
                            {
                                CostTypeId = qitem.ID,
                                Name = qitem.Name,
                                Sort = qitem.Sort ?? 0
                            });
                        }
                    }
                    RGList.Add(rgModel);
                }
                #endregion
                //财务单据
                var RZFinancelist = RB_FinanceRepository.GetListForReport(new RB_Finance_Extend() { sAduitDate = DateTime.Parse(sDate), eAduitDate = DateTime.Now.AddYears(1).AddDays(-1), RB_Branch_Id = -1, RB_Group_Id = GroupId, Is_TCID = 1, TCID = -1, FinanceType = 2 });
                //获取资金调拨单据
                var CapitalAllocationFinanceList = RB_FinanceRepository.GetTradeWayForCapitalAllocation(new RB_Finance_Extend() { sAduitDate = DateTime.Parse(sDate), eAduitDate = DateTime.Now.AddYears(1).AddDays(-1), RB_Branch_Id = -1, RB_Group_Id = GroupId, Is_TCID = 1, TCID = -1 });
                //查询校区
                var schoolList = schoolRepository.GetSchoolListRepository(new Model.ViewModel.User.RB_School_ViewModel() { Group_Id = GroupId });
                List<string> shareList = new List<string>() { "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12" };
                List<RB_SimpleReport> AllSchoolReportList = new List<RB_SimpleReport>();
                foreach (var branchitem in schoolList)
                {
                    Console.WriteLine("校区:" + branchitem.SName);
                    List<RB_SimpleReport> SchoolReportList = new List<RB_SimpleReport>();

                    #region 班级统计
                    RB_SimpleReport IncomeReport = new RB_SimpleReport() { Year = Year, Abstract = "营业收入", Rb_Group_Id = GroupId, Sort = 1, BranchId = branchitem.SId, CostTypeIds = "" };
                    RB_SimpleReport OtherIncomeReport = new RB_SimpleReport() { Year = Year, Abstract = "其他收入", Rb_Group_Id = GroupId, Sort = 2, BranchId = branchitem.SId, CostTypeIds = "" };
                    RB_SimpleReport BonusReport = new RB_SimpleReport() { Year = Year, Abstract = "课时费", Rb_Group_Id = GroupId, Sort = 3, BranchId = branchitem.SId, CostTypeIds = "" };
                    RB_SimpleReport PerfReport = new RB_SimpleReport() { Year = Year, Abstract = "老师绩效", Rb_Group_Id = GroupId, Sort = 4, BranchId = branchitem.SId, CostTypeIds = "" };
                    RB_SimpleReport SellReport = new RB_SimpleReport() { Year = Year, Abstract = "销售提成", Rb_Group_Id = GroupId, Sort = 5, BranchId = branchitem.SId, CostTypeIds = "" };
                    RB_SimpleReport OtherCostReport = new RB_SimpleReport() { Year = Year, Abstract = "其他成本", Rb_Group_Id = GroupId, Sort = 6, BranchId = branchitem.SId, CostTypeIds = "" };
                    RB_SimpleReport TotalReport = new RB_SimpleReport() { Year = Year, Abstract = "营业总毛利", Rb_Group_Id = GroupId, Sort = 7, BranchId = branchitem.SId, CostTypeIds = "" };
                    foreach (var month in shareList)
                    {
                        string startTime = Year + "-" + month + "-01";
                        string endTime = Convert.ToDateTime(Year + "-" + month + "-01").AddMonths(1).AddDays(-1).ToString("yyyy-MM-dd");

                        #region 最新班级

                        List<int> ClassIdArr = new List<int>();
                        //首先根据签到表  查询出所有的班级  并分页
                        var list = class_CheckRepository.GetAllClassNowMonthStatistics(startTime, endTime, 0, "", branchitem.SId, GroupId);
                        if (list.Any())
                        {
                            ClassIdArr.AddRange(list.Select(x => x.ClassId));
                        }
                        //查询时间范围内  除订单外 班级下其他订单 的其他收入  + 其他成本支出
                        string datebaseStr = Config.ReadConfigKey("EduDateBase");//教育数据库
                        var financeList = RB_FinanceRepository.GetListForReportClass(new RB_Finance_Extend() { RB_Group_Id = GroupId, RB_Branch_Id = branchitem.SId, TCID = -2, sAduitDate = Convert.ToDateTime(startTime), eAduitDate = Convert.ToDateTime(endTime), FinanceType = 2, OrderSource = OrderResourceEnum.Education }, datebaseStr);
                        if (financeList.Any())
                        {
                            ClassIdArr.AddRange(financeList.Select(x => x.TCID ?? 0));
                        }
                        string STime = Convert.ToDateTime(startTime).AddMonths(-1).ToString("yyyy-MM-dd");
                        string ETime = Convert.ToDateTime(endTime).AddMonths(-1).ToString("yyyy-MM-dd");
                        var teacherBonusList = teaching_BonusDetailRepository.GetTeacherBonusForDate(GroupId, branchitem.SId, "", STime, ETime);//查询所有班级需要发放
                        if (teacherBonusList.Any())
                        {
                            ClassIdArr.AddRange(teacherBonusList.Select(x => x.ClassId));
                        }
                        var meritsProfitList = teaching_PerfRepository.GetTeacherPerfForDate(GroupId, branchitem.SId, "", startTime, endTime);
                        if (meritsProfitList.Any())
                        {
                            ClassIdArr.AddRange(meritsProfitList.Select(x => x.ClassId));
                        }
                        var saleList = sell_Commission_DetailsRepository.GetSellCommissionForDate(GroupId, branchitem.SId, "", STime, ETime);
                        if (saleList.Any())
                        {
                            ClassIdArr.AddRange(saleList.Select(x => x.ClassId));
                        }

                        ClassIdArr = ClassIdArr.Distinct().ToList();
                        List<RB_Class_ViewModel> CAlllist = new List<RB_Class_ViewModel>();
                        if (ClassIdArr.Any())
                        {
                            //再次查询所有的班级
                            CAlllist = classRepository.GetClassListRepository(new RB_Class_ViewModel() { Group_Id = GroupId, Q_ClassIds = string.Join(",", ClassIdArr) });
                        }

                        if (CAlllist.Any())
                        {
                            string classIds = string.Join(",", CAlllist.Select(x => x.ClassId));
                            //查询时间范围内  所有班级的学生上课金额
                            List<RB_Teaching_BonusDetail_ViewModel> StudentHoursList = new List<RB_Teaching_BonusDetail_ViewModel>();
                            //根据学生签到表  查询
                            var stulist = class_CheckRepository.GetStudentConsumptionHoursDetialList(0, -1, 0, startTime, endTime, "", 0, "", GroupId, classIds);
                            if (stulist.Any())
                            {
                                foreach (var item in stulist)
                                {
                                    decimal UnitPrice = Math.Round(item.UnitPrice, 6, MidpointRounding.AwayFromZero);
                                    StudentHoursList.Add(new RB_Teaching_BonusDetail_ViewModel
                                    {
                                        Date = item.ClassDate,
                                        TimeBucket = item.StartDate + "~" + item.EndDate,
                                        TeacherId = item.OrderGuestId,
                                        TeacherName = item.GuestName,
                                        ClassId = item.ClassId,
                                        ClassName = item.ClassName,
                                        ClassNo = item.ClassNo,
                                        CouseId = item.CouseId,
                                        CourseName = item.CourseName,
                                        KSNum = item.CurrentDeductionHours,
                                        Hours = 0,
                                        HourMoney = 0,
                                        UnitPrice = UnitPrice,
                                        Money = Math.Round(item.UnitPrice * item.CurrentDeductionHours, 6, MidpointRounding.AwayFromZero)
                                    });
                                }
                            }

                            foreach (var item in CAlllist)
                            {
                                #region 学生课耗
                                var slist = StudentHoursList.Where(x => x.ClassId == item.ClassId).ToList();
                                decimal TStuMoney = slist.Sum(x => x.Money);//上课总金额
                                #endregion
                                #region 提成
                                decimal BonusMoney = teacherBonusList.Where(x => x.ClassId == item.ClassId).FirstOrDefault()?.Money ?? 0;//老师课时费
                                decimal PerfMoney = meritsProfitList.Where(x => x.ClassId == item.ClassId).FirstOrDefault()?.Money ?? 0;//老师绩效
                                decimal SellMoney = saleList.Where(x => x.ClassId == item.ClassId).FirstOrDefault()?.CurrentPeriodMoney ?? 0;//销售提成
                                #endregion
                                #region 单据
                                var flist = financeList.Where(x => x.TCID == item.ClassId).ToList();
                                decimal OtherIncome = flist.Where(y => y.Type == WFTempLateClassEnum.IN && y.Is_Cashier == 1 && y.OrderID <= 0).Sum(x => x.Money ?? 0);
                                decimal Fee = flist.Where(x => x.Type == WFTempLateClassEnum.IN && x.Is_Cashier == 1 && x.OrderID <= 0 && x.Fee > 0).GroupBy(x => new { x.FrID, x.Fee }).Sum(x => x.Key.Fee ?? 0);
                                OtherIncome -= Fee;
                                decimal OtherCost = flist.Where(y => y.Type == WFTempLateClassEnum.OUT && y.OrderID <= 0).Sum(x => x.Money ?? 0);//支出也要排除订单订单退款
                                #endregion

                                UpdateClassReportDate(TotalReport, IncomeReport, OtherIncomeReport, BonusReport, PerfReport, SellReport, OtherCostReport, month, TStuMoney, BonusMoney, PerfMoney, SellMoney, OtherIncome, OtherCost);
                            }
                        }
                        #endregion

                        #region 最新留学
                        //查询留学的
                        List<int> SourceIdArr = new List<int>();
                        var lxOrderList = orderRepository.GetListForReport(new RB_Order_ViewModel() { Group_Id = GroupId, School_Id = branchitem.SId, OrderType = Common.Enum.Sale.OrderTypeEnum.StudyabroadOrder, Q_OrderState = 1, ConfirmSTime = startTime, ConfirmETime = endTime });
                        if (lxOrderList.Any())
                        {
                            SourceIdArr.AddRange(lxOrderList.Select(x => x.SourceId).Distinct());
                        }
                        //财务单据   付款单制单那月就统计进那月, 王姐的需求  因为这个是按照月份分摊的
                        var lxFinanceList = RB_FinanceRepository.GetListForReportClass(new RB_Finance_Extend() { RB_Group_Id = GroupId, RB_Branch_Id = branchitem.SId, TCID = -3, sAduitDate = Convert.ToDateTime(startTime), eAduitDate = Convert.ToDateTime(endTime), FinanceType = 2, OrderSource = OrderResourceEnum.EducationStudy }, datebaseStr);
                        if (lxFinanceList.Any())
                        {
                            SourceIdArr.AddRange(lxFinanceList.Select(x => x.TCID ?? 0));
                        }
                        List<RB_Order_Guest_ViewModel> lxGuestList = new List<RB_Order_Guest_ViewModel>();
                        List<Model.ViewModel.StudyAbroad.RB_StudyAbroad_ViewModel> saList = new List<Model.ViewModel.StudyAbroad.RB_StudyAbroad_ViewModel>();
                        if (SourceIdArr.Any())
                        {
                            if (lxOrderList.Any())
                            {
                                string orderIds = string.Join(",", lxOrderList.Select(x => x.OrderId));
                                //查询学生
                                lxGuestList = order_GuestRepository.GetOrderGuestListRepository(new RB_Order_Guest_ViewModel() { Group_Id = GroupId, OrderIds = orderIds });
                            }

                            string saIds = string.Join(",", SourceIdArr.Distinct());
                            //查询留学产品
                            saList = studyAbroadRepository.GetStudyAbroadListExtRepository(new Model.ViewModel.StudyAbroad.RB_StudyAbroad_ViewModel() { Group_Id = GroupId, QIds = saIds });
                        }

                        foreach (var item in saList)
                        {
                            #region 订单
                            var olist = lxOrderList.Where(x => x.SourceId == item.Id).ToList();
                            decimal ShiShou = olist.Sum(item => item.Income - item.Refund + item.PlatformTax);
                            #endregion
                            #region 财务单据
                            var lxflist = lxFinanceList.Where(x => x.TCID == item.Id).ToList();
                            //排序订单单据
                            var cfinanceList = lxflist.Where(x => x.OrderID == 0 && x.Type == WFTempLateClassEnum.IN).ToList();
                            decimal QTShouRu = cfinanceList.Where(y => y.Is_Cashier == 1).Sum(x => x.Money ?? 0);
                            QTShouRu -= cfinanceList.Where(x => x.Is_Cashier == 1 && x.Fee > 0).GroupBy(x => new { x.FrID, x.Fee }).Sum(x => x.Key.Fee ?? 0);
                            //支出
                            decimal TiCheng = (olist != null && olist.Any()) ? olist.Where(x => x.IsCommissionGive == 1).Sum(x => x.CommissionMoney + x.ExtraCommissionMoney) : 0;//销售提成   -留学提成暂定
                            decimal ClassFee = 0;//老师提成   -留学暂定
                            decimal JiXiaoMoney = 0;//绩效提成   -留学暂定

                            var ofinanceList = lxflist.Where(x => (x.OrderID == 0 || (x.OrderID > 0 && x.OtherType == 45)) && x.Type == WFTempLateClassEnum.OUT).ToList();
                            decimal QTZhiChu = ofinanceList.Sum(x => x.Money ?? 0);

                            #endregion

                            UpdateClassReportDate(TotalReport, IncomeReport, OtherIncomeReport, BonusReport, PerfReport, SellReport, OtherCostReport, month, ShiShou, ClassFee, JiXiaoMoney, TiCheng, QTShouRu, QTZhiChu);
                        }


                        #endregion
                    }
                    Console.WriteLine("班级OK");
                    #endregion

                    #region 费用模块
                    var FYList = RGList.Where(x => x.ReportType == 1).OrderBy(x => x.Sort).ThenBy(x => x.CostTypeId).ToList();
                    List<RB_SimpleReport> FYReport = new List<RB_SimpleReport>();
                    //初始赋值营业总毛利
                    RB_SimpleReport fTotalReport = new RB_SimpleReport()
                    {
                        Year = Year,
                        Abstract = "营业利润(亏损)",
                        Rb_Group_Id = GroupId,
                        Sort = 0,
                        BranchId = branchitem.SId,
                        CostTypeIds = "",
                        April = TotalReport.April,
                        August = TotalReport.August,
                        December = TotalReport.December,
                        February = TotalReport.February,
                        FirstQuarter = TotalReport.FourthQuarter,
                        FourthQuarter = TotalReport.FourthQuarter,
                        HalfReport = TotalReport.HalfReport,
                        January = TotalReport.January,
                        July = TotalReport.July,
                        June = TotalReport.June,
                        LastHalfReport = TotalReport.LastHalfReport,
                        March = TotalReport.March,
                        May = TotalReport.May,
                        November = TotalReport.November,
                        October = TotalReport.October,
                        SecondQuarter = TotalReport.SecondQuarter,
                        September = TotalReport.September,
                        ThirdQuarter = TotalReport.ThirdQuarter,
                        Total = TotalReport.Total
                    };//管销费用
                    int i = 8;
                    foreach (var gitem in FYList)
                    {
                        RB_SimpleReport groupReport = new RB_SimpleReport() { Year = Year, Abstract = gitem.Name + "小计", Rb_Group_Id = GroupId, Sort = 0, BranchId = branchitem.SId, CostTypeIds = string.Join(",", gitem.ChildList.Select(x => x.CostTypeId)) };
                        foreach (var qitem in gitem.ChildList.OrderBy(x=>x.Sort).ThenBy(x=>x.CostTypeId)) {
                            //子集具体费用
                            RB_SimpleReport fReport = new RB_SimpleReport() { Year = Year, Abstract = qitem.Name, Rb_Group_Id = GroupId, Sort = i, BranchId = branchitem.SId, CostTypeIds = qitem.CostTypeId.ToString() };
                            foreach (var month in shareList)
                            {
                                sDate = Convert.ToDateTime(Year + "-" + month + "-01").ToString("yyyy-MM-dd");
                                eDate = DateTime.Parse((Year + "-" + month + "-01")).AddMonths(1).AddDays(-1).ToString("yyyy-MM-dd");
                                decimal FYMoney = 0;
                                #region 日常费用
                                //当月的财务单据
                                var Financelist = RZFinancelist.Where(x => x.CostTypeId == qitem.CostTypeId && ((x.Type == WFTempLateClassEnum.OUT && x.CreateDate.Value.ToString("yyyy-MM") == Convert.ToDateTime(sDate).ToString("yyyy-MM")) || (x.Type != WFTempLateClassEnum.OUT && x.TradeDate.Value.ToString("yyyy-MM") == Convert.ToDateTime(sDate).ToString("yyyy-MM"))) && x.RB_Branch_Id == branchitem.SId).ToList();

                                //获取收入和支出
                                var cfinanceList = Financelist.Where(x => x.Type == WFTempLateClassEnum.IN).ToList();
                                decimal ShouRu = cfinanceList.Where(y => y.Is_Cashier == 1).Sum(x => x.Money ?? 0);
                                ShouRu -= cfinanceList.Where(x => x.Is_Cashier == 1 && x.Fee > 0).GroupBy(x => new { x.FrID, x.Fee }).Sum(x => x.Key.Fee ?? 0);
                                //支出
                                var ofinanceList = Financelist.Where(x => x.Type == WFTempLateClassEnum.OUT).ToList();
                                decimal ZhiChu = ofinanceList.Sum(x => x.Money ?? 0);

                                if (gitem.IncomeType == 2)
                                {
                                    FYMoney = ZhiChu - ShouRu;
                                }
                                else {
                                    FYMoney = ShouRu - ZhiChu;
                                }
                                #endregion

                                #region 预付款处理
                                if (qitem.Name.Contains("预付"))
                                {
                                    //预付款 冲抵
                                    var MatchList = Financelist.Where(x => x.MatchMoney > 0).ToList();
                                    if (MatchList.Any())
                                    {
                                        //减去冲抵的金额
                                        var newFList = MatchList.Select(x => x.FrID).Distinct().ToList();
                                        decimal DelMoney = 0;
                                        foreach (var item in newFList)
                                        {
                                            DelMoney += MatchList.Where(x => x.FrID == item).FirstOrDefault()?.MatchMoney ?? 0;
                                        }
                                        FYMoney -= DelMoney;
                                    }
                                }
                                #endregion

                                #region 资金调拨汇兑损益
                                if (qitem.Name == "汇兑损益")
                                {
                                    var calist = CapitalAllocationFinanceList.Where(x => x.AllotDate.Value.ToString("yyyy-MM") == Convert.ToDateTime(sDate).ToString("yyyy-MM") && x.BranchId == branchitem.SId).ToList();
                                    //资金调拨的汇兑损益
                                    decimal iMoney = calist.Where(x => x.AllotType == 1)?.Sum(x => x.Money ?? 0) ?? 0;
                                    decimal oMoney = calist.Where(x => x.AllotType == 2)?.Sum(x => x.Money ?? 0) ?? 0;
                                    FYMoney += oMoney - iMoney;
                                }
                                #endregion

                                switch (month) {
                                    case "01":
                                        fReport.January = FYMoney; groupReport.January += FYMoney; if (gitem.IncomeType == 1) fTotalReport.January += FYMoney; else fTotalReport.January -= FYMoney;
                                            break;
                                    case "02":
                                        fReport.February = FYMoney; groupReport.February += FYMoney; if (gitem.IncomeType == 1) fTotalReport.February += FYMoney; else fTotalReport.February -= FYMoney;
                                        break;
                                    case "03":
                                        fReport.March = FYMoney; groupReport.March += FYMoney; if (gitem.IncomeType == 1) fTotalReport.March += FYMoney; else fTotalReport.March -= FYMoney;
                                        break;
                                    case "04":
                                        fReport.April = FYMoney; groupReport.April += FYMoney; if (gitem.IncomeType == 1) fTotalReport.April += FYMoney; else fTotalReport.April -= FYMoney;
                                        break;
                                    case "05":
                                        fReport.May = FYMoney; groupReport.May += FYMoney; if (gitem.IncomeType == 1) fTotalReport.May += FYMoney; else fTotalReport.May -= FYMoney;
                                        break;
                                    case "06":
                                        fReport.June = FYMoney; groupReport.June += FYMoney; if (gitem.IncomeType == 1) fTotalReport.June += FYMoney; else fTotalReport.June -= FYMoney;
                                        break;
                                    case "07":
                                        fReport.July = FYMoney; groupReport.July += FYMoney; if (gitem.IncomeType == 1) fTotalReport.July += FYMoney; else fTotalReport.July -= FYMoney;
                                        break;
                                    case "08":
                                        fReport.August = FYMoney; groupReport.August += FYMoney; if (gitem.IncomeType == 1) fTotalReport.August += FYMoney; else fTotalReport.August -= FYMoney;
                                        break;
                                    case "09":
                                        fReport.September = FYMoney; groupReport.September += FYMoney; if (gitem.IncomeType == 1) fTotalReport.September += FYMoney; else fTotalReport.September -= FYMoney;
                                        break;
                                    case "10":
                                        fReport.October = FYMoney; groupReport.October += FYMoney; if (gitem.IncomeType == 1) fTotalReport.October += FYMoney; else fTotalReport.October -= FYMoney;
                                        break;
                                    case "11":
                                        fReport.November = FYMoney; groupReport.November += FYMoney; if (gitem.IncomeType == 1) fTotalReport.November += FYMoney; else fTotalReport.November -= FYMoney;
                                        break;
                                    case "12":
                                        fReport.December = FYMoney; groupReport.December += FYMoney; if (gitem.IncomeType == 1) fTotalReport.December += FYMoney; else fTotalReport.December -= FYMoney;
                                        break;
                                }
                            }
                            i++;
                            FYReport.Add(fReport);
                        }
                        groupReport.Sort = i; i++;
                        FYReport.Add(groupReport);
                    }
                    fTotalReport.Sort = i; i++;
                    FYReport.Add(fTotalReport);
                    Console.WriteLine("费用OK");

                    RB_SimpleReport NotReport = new RB_SimpleReport() { Year = Year, Abstract = "以下项均不计入计算", Rb_Group_Id = GroupId, Sort = 0, BranchId = branchitem.SId, CostTypeIds = "" };
                    NotReport.Sort = i; i++;
                    #endregion

                    #region 往来模块
                    var WLList = RGList.Where(x => x.ReportType == 2).OrderBy(x => x.Sort).ThenBy(x => x.CostTypeId).ToList();
                    List<RB_SimpleReport> WLReport = new List<RB_SimpleReport>();
                    foreach (var gitem in WLList)
                    {
                        RB_SimpleReport groupReport = new RB_SimpleReport() { Year = Year, Abstract = gitem.Name + "小计", Rb_Group_Id = GroupId, Sort = 0, BranchId = branchitem.SId, CostTypeIds = string.Join(",", gitem.ChildList.Select(x => x.CostTypeId)) };
                        foreach (var qitem in gitem.ChildList.OrderBy(x => x.Sort).ThenBy(x => x.CostTypeId))
                        {
                            //子集具体费用
                            RB_SimpleReport fReport = new RB_SimpleReport() { Year = Year, Abstract = qitem.Name, Rb_Group_Id = GroupId, Sort = i, BranchId = branchitem.SId, CostTypeIds = qitem.CostTypeId.ToString() };
                            foreach (var month in shareList)
                            {
                                sDate = Convert.ToDateTime(Year + "-" + month + "-01").ToString("yyyy-MM-dd");
                                eDate = DateTime.Parse((Year + "-" + month + "-01")).AddMonths(1).AddDays(-1).ToString("yyyy-MM-dd");
                                decimal FYMoney = 0;
                                #region 日常费用
                                //当月的财务单据
                                var Financelist = RZFinancelist.Where(x => x.CostTypeId == qitem.CostTypeId && ((x.Type == WFTempLateClassEnum.OUT && x.CreateDate.Value.ToString("yyyy-MM") == Convert.ToDateTime(sDate).ToString("yyyy-MM")) || (x.Type != WFTempLateClassEnum.OUT && x.TradeDate.Value.ToString("yyyy-MM") == Convert.ToDateTime(sDate).ToString("yyyy-MM"))) && x.RB_Branch_Id == branchitem.SId).ToList();

                                //获取收入和支出
                                var cfinanceList = Financelist.Where(x => x.Type == WFTempLateClassEnum.IN).ToList();
                                decimal ShouRu = cfinanceList.Where(y => y.Is_Cashier == 1).Sum(x => x.Money ?? 0);
                                ShouRu -= cfinanceList.Where(x => x.Is_Cashier == 1 && x.Fee > 0).GroupBy(x => new { x.FrID, x.Fee }).Sum(x => x.Key.Fee ?? 0);
                                //支出
                                var ofinanceList = Financelist.Where(x => x.Type == WFTempLateClassEnum.OUT).ToList();
                                decimal ZhiChu = ofinanceList.Sum(x => x.Money ?? 0);

                                if (gitem.IncomeType == 2)
                                {
                                    FYMoney = ZhiChu - ShouRu;
                                }
                                else
                                {
                                    FYMoney = ShouRu - ZhiChu;
                                }
                                #endregion

                                #region 预付款处理
                                if (qitem.Name.Contains("预付"))
                                {
                                    //预付款 冲抵
                                    var MatchList = Financelist.Where(x => x.MatchMoney > 0).ToList();
                                    if (MatchList.Any())
                                    {
                                        //减去冲抵的金额
                                        var newFList = MatchList.Select(x => x.FrID).Distinct().ToList();
                                        decimal DelMoney = 0;
                                        foreach (var item in newFList)
                                        {
                                            DelMoney += MatchList.Where(x => x.FrID == item).FirstOrDefault()?.MatchMoney ?? 0;
                                        }
                                        FYMoney -= DelMoney;
                                    }
                                }
                                #endregion

                                #region 资金调拨汇兑损益
                                if (qitem.Name == "汇兑损益")
                                {
                                    var calist = CapitalAllocationFinanceList.Where(x => x.AllotDate.Value.ToString("yyyy-MM") == Convert.ToDateTime(sDate).ToString("yyyy-MM") && x.BranchId == branchitem.SId).ToList();
                                    //资金调拨的汇兑损益
                                    decimal iMoney = calist.Where(x => x.AllotType == 1)?.Sum(x => x.Money ?? 0) ?? 0;
                                    decimal oMoney = calist.Where(x => x.AllotType == 2)?.Sum(x => x.Money ?? 0) ?? 0;
                                    FYMoney += oMoney - iMoney;
                                }
                                #endregion

                                RB_SimpleReport cfReport = new RB_SimpleReport();
                                switch (month)
                                {
                                    case "01":
                                        fReport.January = FYMoney; groupReport.January += FYMoney; 
                                        break;
                                    case "02":
                                        fReport.February = FYMoney; groupReport.February += FYMoney; 
                                        break;
                                    case "03":
                                        fReport.March = FYMoney; groupReport.March += FYMoney;
                                        break;
                                    case "04":
                                        fReport.April = FYMoney; groupReport.April += FYMoney; 
                                        break;
                                    case "05":
                                        fReport.May = FYMoney; groupReport.May += FYMoney; 
                                        break;
                                    case "06":
                                        fReport.June = FYMoney; groupReport.June += FYMoney; 
                                        break;
                                    case "07":
                                        fReport.July = FYMoney; groupReport.July += FYMoney; 
                                        break;
                                    case "08":
                                        fReport.August = FYMoney; groupReport.August += FYMoney; 
                                        break;
                                    case "09":
                                        fReport.September = FYMoney; groupReport.September += FYMoney;
                                        break;
                                    case "10":
                                        fReport.October = FYMoney; groupReport.October += FYMoney; 
                                        break;
                                    case "11":
                                        fReport.November = FYMoney; groupReport.November += FYMoney; 
                                        break;
                                    case "12":
                                        fReport.December = FYMoney; groupReport.December += FYMoney; 
                                        break;
                                }
                            }
                            i++;
                            WLReport.Add(fReport);
                        }
                        groupReport.Sort = i; i++;
                        WLReport.Add(groupReport);
                    }
                    Console.WriteLine("往来OK");
                    #endregion

                    #region 其他模块
                    var QTList = RGList.Where(x => x.ReportType == 3).OrderBy(x => x.Sort).ThenBy(x => x.CostTypeId).ToList();
                    List<RB_SimpleReport> QTReport = new List<RB_SimpleReport>();
                    foreach (var gitem in QTList)
                    {
                        RB_SimpleReport groupReport = new RB_SimpleReport() { Year = Year, Abstract = gitem.Name + "小计", Rb_Group_Id = GroupId, Sort = 0, BranchId = branchitem.SId, CostTypeIds = string.Join(",", gitem.ChildList.Select(x => x.CostTypeId)) };
                        foreach (var qitem in gitem.ChildList.OrderBy(x => x.Sort).ThenBy(x => x.CostTypeId))
                        {
                            //子集具体费用
                            RB_SimpleReport fReport = new RB_SimpleReport() { Year = Year, Abstract = qitem.Name, Rb_Group_Id = GroupId, Sort = i, BranchId = branchitem.SId, CostTypeIds = qitem.CostTypeId.ToString() };
                            foreach (var month in shareList)
                            {
                                sDate = Convert.ToDateTime(Year + "-" + month + "-01").ToString("yyyy-MM-dd");
                                eDate = DateTime.Parse((Year + "-" + month + "-01")).AddMonths(1).AddDays(-1).ToString("yyyy-MM-dd");
                                decimal FYMoney = 0;
                                #region 日常费用
                                //当月的财务单据
                                var Financelist = RZFinancelist.Where(x => x.CostTypeId == qitem.CostTypeId && ((x.Type == WFTempLateClassEnum.OUT && x.CreateDate.Value.ToString("yyyy-MM") == Convert.ToDateTime(sDate).ToString("yyyy-MM")) || (x.Type != WFTempLateClassEnum.OUT && x.TradeDate.Value.ToString("yyyy-MM") == Convert.ToDateTime(sDate).ToString("yyyy-MM"))) && x.RB_Branch_Id == branchitem.SId).ToList();

                                //获取收入和支出
                                var cfinanceList = Financelist.Where(x => x.Type == WFTempLateClassEnum.IN).ToList();
                                decimal ShouRu = cfinanceList.Where(y => y.Is_Cashier == 1).Sum(x => x.Money ?? 0);
                                ShouRu -= cfinanceList.Where(x => x.Is_Cashier == 1 && x.Fee > 0).GroupBy(x => new { x.FrID, x.Fee }).Sum(x => x.Key.Fee ?? 0);
                                //支出
                                var ofinanceList = Financelist.Where(x => x.Type == WFTempLateClassEnum.OUT).ToList();
                                decimal ZhiChu = ofinanceList.Sum(x => x.Money ?? 0);

                                if (gitem.IncomeType == 2)
                                {
                                    FYMoney = ZhiChu - ShouRu;
                                }
                                else
                                {
                                    FYMoney = ShouRu - ZhiChu;
                                }
                                #endregion

                                #region 预付款处理
                                if (qitem.Name.Contains("预付"))
                                {
                                    //预付款 冲抵
                                    var MatchList = Financelist.Where(x => x.MatchMoney > 0).ToList();
                                    if (MatchList.Any())
                                    {
                                        //减去冲抵的金额
                                        var newFList = MatchList.Select(x => x.FrID).Distinct().ToList();
                                        decimal DelMoney = 0;
                                        foreach (var item in newFList)
                                        {
                                            DelMoney += MatchList.Where(x => x.FrID == item).FirstOrDefault()?.MatchMoney ?? 0;
                                        }
                                        FYMoney -= DelMoney;
                                    }
                                }
                                #endregion

                                #region 资金调拨汇兑损益
                                if (qitem.Name == "汇兑损益")
                                {
                                    var calist = CapitalAllocationFinanceList.Where(x => x.AllotDate.Value.ToString("yyyy-MM") == Convert.ToDateTime(sDate).ToString("yyyy-MM") && x.BranchId == branchitem.SId).ToList();
                                    //资金调拨的汇兑损益
                                    decimal iMoney = calist.Where(x => x.AllotType == 1)?.Sum(x => x.Money ?? 0) ?? 0;
                                    decimal oMoney = calist.Where(x => x.AllotType == 2)?.Sum(x => x.Money ?? 0) ?? 0;
                                    FYMoney += oMoney - iMoney;
                                }
                                #endregion

                                switch (month)
                                {
                                    case "01":
                                        fReport.January = FYMoney; groupReport.January += FYMoney;
                                        break;
                                    case "02":
                                        fReport.February = FYMoney; groupReport.February += FYMoney;
                                        break;
                                    case "03":
                                        fReport.March = FYMoney; groupReport.March += FYMoney;
                                        break;
                                    case "04":
                                        fReport.April = FYMoney; groupReport.April += FYMoney;
                                        break;
                                    case "05":
                                        fReport.May = FYMoney; groupReport.May += FYMoney;
                                        break;
                                    case "06":
                                        fReport.June = FYMoney; groupReport.June += FYMoney;
                                        break;
                                    case "07":
                                        fReport.July = FYMoney; groupReport.July += FYMoney;
                                        break;
                                    case "08":
                                        fReport.August = FYMoney; groupReport.August += FYMoney;
                                        break;
                                    case "09":
                                        fReport.September = FYMoney; groupReport.September += FYMoney;
                                        break;
                                    case "10":
                                        fReport.October = FYMoney; groupReport.October += FYMoney;
                                        break;
                                    case "11":
                                        fReport.November = FYMoney; groupReport.November += FYMoney;
                                        break;
                                    case "12":
                                        fReport.December = FYMoney; groupReport.December += FYMoney;
                                        break;
                                }
                            }
                            i++;
                            QTReport.Add(fReport);
                        }
                        groupReport.Sort = i; i++;
                        QTReport.Add(groupReport);
                    }
                    Console.WriteLine("其他OK");
                    #endregion

                    #region 计算统计
                    SchoolReportList.Add(IncomeReport);
                    SchoolReportList.Add(OtherIncomeReport);
                    SchoolReportList.Add(BonusReport);
                    SchoolReportList.Add(PerfReport);
                    SchoolReportList.Add(SellReport);
                    SchoolReportList.Add(OtherCostReport);
                    SchoolReportList.Add(TotalReport);
                    SchoolReportList.Add(NotReport);
                    SchoolReportList.AddRange(FYReport);
                    SchoolReportList.AddRange(WLReport);
                    SchoolReportList.AddRange(QTReport);

                    SchoolReportList.ForEach(x =>
                    {
                        x.FirstQuarter = x.January + x.February + x.March;
                        x.SecondQuarter = x.April + x.May + x.June;
                        x.ThirdQuarter = x.July + x.August + x.September;
                        x.FourthQuarter = x.October + x.November + x.December;
                        x.HalfReport = x.FirstQuarter + x.SecondQuarter;
                        x.LastHalfReport = x.ThirdQuarter + x.FourthQuarter;
                        x.Total = x.HalfReport + x.LastHalfReport;
                    });

                    AllSchoolReportList.AddRange(SchoolReportList);
                    #endregion
                }

                if (AllSchoolReportList.Any()) {
                    Console.WriteLine("开始汇总插入:" + AllSchoolReportList.Count());
                    //计算汇总
                    var HZList = AllSchoolReportList.GroupBy(x => new { x.Year, x.Abstract, x.Rb_Group_Id, x.Sort, x.CostTypeIds }).Select(x => new RB_SimpleReport_Extend()
                    {
                        ID = 0,
                        Rb_Group_Id = x.Key.Rb_Group_Id,
                        Year = x.Key.Year,
                        Abstract = x.Key.Abstract,
                        April = x.Sum(y => y.April),
                        August = x.Sum(y => y.August),
                        BranchId = -1,
                        CostTypeIds = x.Key.CostTypeIds,
                        December = x.Sum(y => y.December),
                        February = x.Sum(y => y.February),
                        FirstQuarter = x.Sum(y => y.FirstQuarter),
                        FourthQuarter = x.Sum(z => z.FourthQuarter),
                        HalfReport = x.Sum(z => z.HalfReport),
                        January = x.Sum(z => z.January),
                        July = x.Sum(z => z.July),
                        June = x.Sum(z => z.June),
                        LastHalfReport = x.Sum(z => z.LastHalfReport),
                        March = x.Sum(z => z.March),
                        May = x.Sum(z => z.May),
                        November = x.Sum(z => z.November),
                        October = x.Sum(z => z.October),
                        SecondQuarter = x.Sum(z => z.SecondQuarter),
                        September = x.Sum(z => z.September),
                        Sort = x.Key.Sort,
                        ThirdQuarter = x.Sum(z => z.ThirdQuarter),
                        Total = x.Sum(z => z.Total)
                    }).ToList();
                    AllSchoolReportList.AddRange(HZList);

                    var OldList = edu_simpleReportRepository.GetList(new RB_SimpleReport_Extend() { Year = Year, Rb_Group_Id = GroupId, BranchId = -2 });//查询所有的
                    foreach (var item in AllSchoolReportList) {
                        var oldModel = OldList.Where(x => x.Year == item.Year && x.Abstract == item.Abstract && x.BranchId == item.BranchId).FirstOrDefault();
                        if (oldModel == null)
                        {
                            edu_simpleReportRepository.Insert(item);
                        }
                        else {
                            item.ID = oldModel.ID;
                            edu_simpleReportRepository.Update(item);
                            oldModel.IsUpdate = 1;
                        }
                    }
                    var delList = OldList.Where(x => x.IsUpdate == 0).ToList();
                    edu_simpleReportRepository.DeleteBatch(delList);
                    Console.WriteLine("汇总OK");
                }

                var fumodel = edu_UpdateRecordRepository.GetList(new RB_Report_UpdateRecord() { Type = 2 }).FirstOrDefault();
                if (fumodel != null)
                {
                    fumodel.EndDate = DateTime.Now;
                    edu_UpdateRecordRepository.Update(fumodel);
                }
                return true;
            }
            catch (Exception ex)
            {
                LogHelper.Write(ex, "InsertBatchSimple_V2");
            }
            return true;
        }

        /// <summary>
        /// 更新班级数据
        /// </summary>
        /// <param name="IncomeReport"></param>
        /// <param name="OtherIncomeReport"></param>
        /// <param name="BonusReport"></param>
        /// <param name="PerfReport"></param>
        /// <param name="SellReport"></param>
        /// <param name="OtherCostReport"></param>
        /// <param name="month"></param>
        /// <param name="TStuMoney"></param>
        /// <param name="BonusMoney"></param>
        /// <param name="PerfMoney"></param>
        /// <param name="SellMoney"></param>
        /// <param name="OtherIncome"></param>
        /// <param name="OtherCost"></param>
        private static void UpdateClassReportDate(RB_SimpleReport TotalReport, RB_SimpleReport IncomeReport, RB_SimpleReport OtherIncomeReport, RB_SimpleReport BonusReport, RB_SimpleReport PerfReport, RB_SimpleReport SellReport, RB_SimpleReport OtherCostReport, string month, decimal TStuMoney, decimal BonusMoney, decimal PerfMoney, decimal SellMoney, decimal OtherIncome, decimal OtherCost)
        {
            switch (month)
            {
                case "01":
                    IncomeReport.January += TStuMoney;
                    OtherIncomeReport.January += OtherIncome;
                    BonusReport.January += BonusMoney;
                    PerfReport.January += PerfMoney;
                    SellReport.January += SellMoney;
                    OtherCostReport.January += OtherCost;
                    TotalReport.January += TStuMoney + OtherIncome - BonusMoney - PerfMoney - SellMoney - OtherCost;
                    break;
                case "02":
                    IncomeReport.February += TStuMoney;
                    OtherIncomeReport.February += OtherIncome;
                    BonusReport.February += BonusMoney;
                    PerfReport.February += PerfMoney;
                    SellReport.February += SellMoney;
                    OtherCostReport.February += OtherCost;
                    TotalReport.February += TStuMoney + OtherIncome - BonusMoney - PerfMoney - SellMoney - OtherCost;
                    break;
                case "03":
                    IncomeReport.March += TStuMoney;
                    OtherIncomeReport.March += OtherIncome;
                    BonusReport.March += BonusMoney;
                    PerfReport.March += PerfMoney;
                    SellReport.March += SellMoney;
                    OtherCostReport.March += OtherCost;
                    TotalReport.March += TStuMoney + OtherIncome - BonusMoney - PerfMoney - SellMoney - OtherCost;
                    break;
                case "04":
                    IncomeReport.April += TStuMoney;
                    OtherIncomeReport.April += OtherIncome;
                    BonusReport.April += BonusMoney;
                    PerfReport.April += PerfMoney;
                    SellReport.April += SellMoney;
                    OtherCostReport.April += OtherCost;
                    TotalReport.April += TStuMoney + OtherIncome - BonusMoney - PerfMoney - SellMoney - OtherCost;
                    break;
                case "05":
                    IncomeReport.May += TStuMoney;
                    OtherIncomeReport.May += OtherIncome;
                    BonusReport.May += BonusMoney;
                    PerfReport.May += PerfMoney;
                    SellReport.May += SellMoney;
                    OtherCostReport.May += OtherCost;
                    TotalReport.May += TStuMoney + OtherIncome - BonusMoney - PerfMoney - SellMoney - OtherCost;
                    break;
                case "06":
                    IncomeReport.June += TStuMoney;
                    OtherIncomeReport.June += OtherIncome;
                    BonusReport.June += BonusMoney;
                    PerfReport.June += PerfMoney;
                    SellReport.June += SellMoney;
                    OtherCostReport.June += OtherCost;
                    TotalReport.June += TStuMoney + OtherIncome - BonusMoney - PerfMoney - SellMoney - OtherCost;
                    break;
                case "07":
                    IncomeReport.July += TStuMoney;
                    OtherIncomeReport.July += OtherIncome;
                    BonusReport.July += BonusMoney;
                    PerfReport.July += PerfMoney;
                    SellReport.July += SellMoney;
                    OtherCostReport.July += OtherCost;
                    TotalReport.July += TStuMoney + OtherIncome - BonusMoney - PerfMoney - SellMoney - OtherCost;
                    break;
                case "08":
                    IncomeReport.August += TStuMoney;
                    OtherIncomeReport.August += OtherIncome;
                    BonusReport.August += BonusMoney;
                    PerfReport.August += PerfMoney;
                    SellReport.August += SellMoney;
                    OtherCostReport.August += OtherCost;
                    TotalReport.August += TStuMoney + OtherIncome - BonusMoney - PerfMoney - SellMoney - OtherCost;
                    break;
                case "09":
                    IncomeReport.September += TStuMoney;
                    OtherIncomeReport.September += OtherIncome;
                    BonusReport.September += BonusMoney;
                    PerfReport.September += PerfMoney;
                    SellReport.September += SellMoney;
                    OtherCostReport.September += OtherCost;
                    TotalReport.September += TStuMoney + OtherIncome - BonusMoney - PerfMoney - SellMoney - OtherCost;
                    break;
                case "10":
                    IncomeReport.October += TStuMoney;
                    OtherIncomeReport.October += OtherIncome;
                    BonusReport.October += BonusMoney;
                    PerfReport.October += PerfMoney;
                    SellReport.October += SellMoney;
                    OtherCostReport.October += OtherCost;
                    TotalReport.October += TStuMoney + OtherIncome - BonusMoney - PerfMoney - SellMoney - OtherCost;
                    break;
                case "11":
                    IncomeReport.November += TStuMoney;
                    OtherIncomeReport.November += OtherIncome;
                    BonusReport.November += BonusMoney;
                    PerfReport.November += PerfMoney;
                    SellReport.November += SellMoney;
                    OtherCostReport.November += OtherCost;
                    TotalReport.November += TStuMoney + OtherIncome - BonusMoney - PerfMoney - SellMoney - OtherCost;
                    break;
                case "12":
                    IncomeReport.December += TStuMoney;
                    OtherIncomeReport.December += OtherIncome;
                    BonusReport.December += BonusMoney;
                    PerfReport.December += PerfMoney;
                    SellReport.December += SellMoney;
                    OtherCostReport.December += OtherCost;
                    TotalReport.December += TStuMoney + OtherIncome - BonusMoney - PerfMoney - SellMoney - OtherCost;
                    break;
            }
        }

        /// <summary>
        /// 获取简易报表列表
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public List<RB_SimpleReport_Extend> GetEasyReportList(RB_SimpleReport_Extend model)
        {
            var list = edu_simpleReportRepository.GetList(model);
            return list;
        }


        /// <summary>
        /// 获取管销费用
        /// </summary>
        /// <param name="financeList"></param>
        /// <returns></returns>
        public decimal GetGXFY(List<RB_Finance_Extend> Financelist)
        {
            decimal GXFY = 0;
            GXFY += GetCostIds(50, Financelist, false, 1, true);
            GXFY += GetCostIds(15, Financelist, false, 1, true);
            GXFY += GetCostIds(16, Financelist, false, 1, true);
            GXFY += GetCostIds(17, Financelist, false, 1, true);
            GXFY += GetCostIds(18, Financelist, false, 1, true);
            GXFY += GetCostIds(19, Financelist, false, 1, true);
            GXFY += GetCostIds(20, Financelist, false, 1, true);
            GXFY += GetCostIds(21, Financelist, false, 1, true);
            GXFY += GetCostIds(22, Financelist, false, 1, true);
            GXFY += GetCostIds(23, Financelist, false, 1, true);
            GXFY += GetCostIds(52, Financelist, false, 1, true);
            GXFY += GetCostIds(24, Financelist, false, 1, true);
            GXFY += GetCostIds(25, Financelist, false, 1, true);
            GXFY += GetCostIds(26, Financelist, false, 1, true);
            GXFY += GetCostIds(27, Financelist, false, 1, true);
            GXFY += GetCostIds(28, Financelist, false, 1, true);
            GXFY += GetCostIds(29, Financelist, false, 1, true);
            GXFY += GetCostIds(30, Financelist, false, 1, true);
            GXFY += GetCostIds(31, Financelist, false, 1, true);
            GXFY += GetCostIds(32, Financelist, false, 1, true);
            GXFY += GetCostIds(33, Financelist, false, 1, true);
            GXFY += GetCostIds(34, Financelist, false, 1, true);
            GXFY += GetCostIds(35, Financelist, false, 1, true);
            GXFY += GetCostIds(36, Financelist, false, 1, true);
            GXFY += GetCostIds(41, Financelist, false, 1, true);
            GXFY += GetCostIds(39, Financelist, false, 1, true);
            GXFY += GetCostIds(40, Financelist, false, 1, true);
            GXFY += GetCostIds(51, Financelist, false, 1, true);
            return GXFY;
        }

        public decimal GetCostIds(int Type, List<RB_Finance_Extend> NewfinanceList, bool flag = false, int count = 0, bool IsRCSZ = false)
        {
            string ids = string.Empty;
            decimal Money = 0, Fee = 0;
            if (NewfinanceList != null && NewfinanceList.Count() > 0)
            {
                switch (Type)
                {
                    //佣金收入
                    case 1:
                        NewfinanceList = NewfinanceList.Where(z => (z.Name.Contains("乳胶") || z.Name.Contains("御宝") || z.Name.Contains("乐天") || z.Name.Contains("茶道") || z.Name.Contains("高岛屋") || z.Name.Contains("TOKIS") || z.Name.Contains("电器LAOX") || z.Name.Contains("机场免税店") || z.Name.Contains("永山免税店") || z.Name.Contains("公社免税店") || z.Name.Contains("电器AKKYONE") || z.Name.Contains("橡胶店") || z.Name.Contains("琅勃拉邦古丝绸") || z.Name.Contains("老挝万象金沉香") || z.Name.Contains("老挝万象东盟珠宝") || z.Name.Contains("琅勃拉邦皇家乳胶") || z.Name.Contains("老挝土产") || z.Name.Contains("老挝红木") || z.Name.Contains("琅勃拉邦风情园") || z.Name.Contains("锅具") || z.Name.Contains("琅勃拉邦银寨") || z.Name.Contains("琅勃拉邦咖啡庄园") || z.Name.Contains("金占巴百草园")) && z.Type == WFTempLateClassEnum.IN).ToList();
                        break;
                    //自费收入
                    case 2:
                        NewfinanceList = NewfinanceList.Where(z => (z.Name.Contains("自费") || z.Name.Contains("自费收支结算")) && z.Type == WFTempLateClassEnum.IN).ToList();
                        break;
                    //其他收入
                    case -1:
                        var NoOtherList = NewfinanceList.Where(z => z.Type == WFTempLateClassEnum.IN && (z.Name.Contains("团费") || z.Name.Contains("小费") || z.Name.Contains("地接费(结算)") || z.Name.Contains("自费") || z.Name.Contains("自费收支结算") || z.Name.Contains("乳胶") || z.Name.Contains("御宝") || z.Name.Contains("御宝(珠宝店)") || z.Name.Contains("乐天") || z.Name.Contains("茶道") || z.Name.Contains("高岛屋") || z.Name.Contains("TOKIS") || z.Name.Contains("电器LAOX") || z.Name.Contains("机场免税店") || z.Name.Contains("永山免税店") || z.Name.Contains("公社免税店") || z.Name.Contains("电器AKKYONE") || z.Name.Contains("橡胶店") || z.Name.Contains("琅勃拉邦古丝绸") || z.Name.Contains("老挝万象金沉香") || z.Name.Contains("老挝万象东盟珠宝") || z.Name.Contains("琅勃拉邦皇家乳胶") || z.Name.Contains("老挝土产") || z.Name.Contains("老挝红木") || z.Name.Contains("琅勃拉邦风情园") || z.Name.Contains("锅具") || z.Name.Contains("琅勃拉邦银寨") || z.Name.Contains("琅勃拉邦咖啡庄园") || z.Name.Contains("金占巴百草园"))).ToList();
                        NewfinanceList = NewfinanceList.Where(z => z.Type == WFTempLateClassEnum.IN && !NoOtherList.Select(x => x.FrID).Contains(z.FrID)).ToList();
                        break;
                    //小费收入
                    case 3:
                        var xflist = NewfinanceList.Where(z => z.Name.Contains("小费") && z.Type == WFTempLateClassEnum.IN).ToList();
                        NewfinanceList = NewfinanceList.Where(x => xflist.Select(z => z.FrID).Contains(x.FrID)).ToList();
                        break;
                    //佣金+小费+自费
                    case 4:
                        NewfinanceList = NewfinanceList.Where(z => z.Type == WFTempLateClassEnum.IN && (z.Name.Contains("地接收入") || z.Name.Contains("小费") || z.Name.Contains("自费"))).ToList();
                        break;
                    //邀请函、名单表
                    case 5:
                        NewfinanceList = NewfinanceList.Where(z => (z.Name.Contains("邀请函") || z.Name.Contains("名单表")) && z.Type == WFTempLateClassEnum.OUT).ToList();
                        break;
                    //车资
                    case 6:
                        NewfinanceList = NewfinanceList.Where(z => z.Name.Contains("车资") && z.Type == WFTempLateClassEnum.OUT).ToList(); break;
                    //国内联运机票
                    case 7:
                        NewfinanceList = NewfinanceList.Where(z => z.Name.Contains("国内联运") && z.Type == WFTempLateClassEnum.OUT).ToList(); break;
                    //签证
                    case 8:
                        NewfinanceList = NewfinanceList.Where(z => z.Name.Contains("签证") && z.Type == WFTempLateClassEnum.OUT).ToList(); break;
                    //其他支出
                    case 9:
                        //同时排除取消退款那种情况
                        var dellist = NewfinanceList.Where(z => z.Type == WFTempLateClassEnum.OUT && z.Name.Contains("取消退款")).ToList();
                        if (dellist != null && dellist.Count() > 0)
                        {
                            List<int> FrIdList = dellist.Select(x => x.FrID).ToList();
                            foreach (var item in FrIdList)
                            {
                                var delClist = NewfinanceList.Where(z => z.Type == WFTempLateClassEnum.OUT && z.Name.Contains("国际段机票") && z.FrID == item).ToList();
                                if (delClist != null && delClist.Count() > 0)
                                {
                                    //说明这个是属于机票的取消
                                    NewfinanceList = NewfinanceList.Where(z => z.FrID != item).ToList();
                                }
                            }
                        }
                        NewfinanceList = NewfinanceList.Where(z =>
                        (
                        z.Type == WFTempLateClassEnum.OUT && (!z.Name.Contains("邀请函") && !z.Name.Contains("名单表") && !z.Name.Contains("车资") && !z.Name.Contains("国际段机票") && !z.Name.Contains("机票罚金") && !z.Name.Contains("机票税金") && !z.Name.Contains("机票定金") && !z.Name.Contains("机票退税") && !z.Name.Contains("国际内陆段机票") && !z.Name.Contains("延时费") && !z.Name.Contains("国内联运") && !z.Name.Contains("签证") && !z.Name.Contains("地接费(领取)") && !z.Name.Contains("地接费(结算)") && !z.Name.Contains("赔偿") && !z.Name.Contains("领队佣金") && !z.Name.Contains("领队奖励金") && !z.Name.Contains("导游佣金") && !z.Name.Contains("旅游责任险") && !z.Name.Contains("保险费")))
                        ).ToList();
                        break;
                    //地接款支出  2019-04-24  ld   徐总需求  小于0的表示收入
                    case 10:
                        NewfinanceList.Where(z => z.Name.Contains("地接费(结算)")).ToList().ForEach(z =>
                        {
                            //判断  如果是负数的地接费结算  表示是收入
                            if (z.Type == WFTempLateClassEnum.OUT && (z.Money ?? 0) < 0)
                            {
                                z.Type = WFTempLateClassEnum.IN;
                                z.Money = 0 - z.Money;
                                z.PayMoney = 0 - (z.PayMoney ?? 0);
                                z.Fee = 0 - (z.Fee ?? 0);
                            }
                        });
                        NewfinanceList = NewfinanceList.Where(z => (z.Name.Contains("地接费(领取)") || z.Name.Contains("地接费(结算)")) && z.Type == WFTempLateClassEnum.OUT).ToList(); break;
                    //地接款收入   2019-04-24  ld   徐总需求  小于0的表示收入
                    case 11:
                        NewfinanceList.Where(z => z.Name.Contains("地接费(结算)")).ToList().ForEach(z =>
                        {
                            //判断  如果是负数的地接费结算  表示是收入
                            if (z.Type == WFTempLateClassEnum.OUT && (z.Money ?? 0) < 0)
                            {
                                z.Type = WFTempLateClassEnum.IN;
                                z.Money = 0 - z.Money;
                                z.PayMoney = 0 - (z.PayMoney ?? 0);
                                z.Fee = 0 - (z.Fee ?? 0);
                            }
                        });
                        NewfinanceList = NewfinanceList.Where(z => z.Name.Contains("地接费(结算)") && z.Type == WFTempLateClassEnum.IN).ToList(); break;
                    //小费收入
                    case 12:
                        NewfinanceList = NewfinanceList.Where(z => z.Name.Contains("小费") && z.Type == WFTempLateClassEnum.IN).ToList(); break;
                    //自费收入
                    case 13:
                        NewfinanceList = NewfinanceList.Where(z => z.Name.Contains("自费") && z.Type == WFTempLateClassEnum.IN).ToList(); break;
                    //简易报表
                    //意外险
                    case 14:
                        NewfinanceList = NewfinanceList.Where(z => z.Name.Contains("旅游责任险") || z.Name.Contains("保险费")).ToList(); break;
                    //工资
                    case 15:
                        NewfinanceList = NewfinanceList.Where(z => z.Name.Contains("工资") && !z.Name.Contains("员工工资(还款)")).ToList(); break;
                    //业务提成
                    case 16:
                        NewfinanceList = NewfinanceList.Where(z => z.Name.Contains("业务提成(签证)") || z.Name.Contains("业务提成(地接)") || z.Name.Contains("业务提成(票务)") || z.Name.Contains("人头奖励(销售)")).ToList(); break;
                    //社保
                    case 17:
                        NewfinanceList = NewfinanceList.Where(z => z.Name.Contains("社会保障费")).ToList(); break;
                    //员工福利及竞赛奖金
                    case 18:
                        NewfinanceList = NewfinanceList.Where(z => z.Name.Contains("福利及奖金")).ToList(); break;
                    //办公用品
                    case 19:
                        NewfinanceList = NewfinanceList.Where(z => z.Name.Contains("办公用品")).ToList(); break;
                    //差旅费
                    case 20:
                        NewfinanceList = NewfinanceList.Where(z => z.Name.Contains("差旅费")).ToList(); break;
                    //电话费(通訊費)
                    case 21:
                        NewfinanceList = NewfinanceList.Where(z => z.Name.Contains("电话费") || z.Name.Contains("通讯费")).ToList(); break;
                    //物管水电费
                    case 22:
                        NewfinanceList = NewfinanceList.Where(z => z.Name.Contains("物管水电费")).ToList(); break;
                    //房租
                    case 23:
                        NewfinanceList = NewfinanceList.Where(z => z.Name.Contains("房租")).ToList(); break;
                    //广告费
                    case 24:
                        NewfinanceList = NewfinanceList.Where(z => z.Name.Contains("广告费")).ToList(); break;
                    //业务招待
                    case 25:
                        NewfinanceList = NewfinanceList.Where(z => z.Name.Contains("业务招待")).ToList(); break;
                    //累计折旧
                    case 26:
                        NewfinanceList = NewfinanceList.Where(z => z.Name.Contains("累计折旧")).ToList(); break;
                    //税金
                    case 27:
                        NewfinanceList = NewfinanceList.Where(z => z.Name == "税金").ToList(); break;
                    //平台使用费
                    case 28:
                        NewfinanceList = NewfinanceList.Where(z => z.Name.Contains("平台使用费")).ToList(); break;
                    //電腦系统费
                    case 29:
                        NewfinanceList = NewfinanceList.Where(z => z.Name.Contains("電腦系统费") || z.Name.Contains("系统使用费")).ToList(); break;
                    //市内交通费
                    case 30:
                        NewfinanceList = NewfinanceList.Where(z => z.Name.Contains("市内交通费")).ToList(); break;
                    //团队建设费
                    case 31:
                        NewfinanceList = NewfinanceList.Where(z => z.Name.Contains("团队建设费")).ToList(); break;
                    //会务费
                    case 32:
                        NewfinanceList = NewfinanceList.Where(z => z.Name.Contains("会务费")).ToList(); break;
                    //同行返利
                    case 33:
                        NewfinanceList = NewfinanceList.Where(z => z.Name.Contains("同行返利") || z.Name.Contains("平台大红包返款") || z.Name.Contains("平台佣金")).ToList(); break;
                    //工会经费
                    case 34:
                        NewfinanceList = NewfinanceList.Where(z => z.Name.Contains("工会经费")).ToList(); break;
                    //律师费
                    case 35:
                        NewfinanceList = NewfinanceList.Where(z => z.Name.Contains("律师费")).ToList(); break;
                    //服务器管理费
                    case 36:
                        NewfinanceList = NewfinanceList.Where(z => z.Name.Contains("服务器管理费")).ToList(); break;
                    //导游佣金
                    case 37:
                        NewfinanceList = NewfinanceList.Where(z => z.Name.Contains("导游佣金")).ToList(); break;
                    //领队佣金
                    case 38:
                        NewfinanceList = NewfinanceList.Where(z => z.Name.Contains("领队佣金") || z.Name.Contains("领队奖励金")).ToList(); break;
                    //航空公司保证金(会退)
                    case 39:
                        NewfinanceList = NewfinanceList.Where(z => z.Name.Contains("航空公司保证金(会退)")).ToList(); break;
                    //航空公司大订金(会抵扣)
                    case 40:
                        NewfinanceList = NewfinanceList.Where(z => z.Name.Contains("航空公司大订金(会抵扣)")).ToList(); break;
                    //汇款手续费
                    case 41:
                        NewfinanceList = NewfinanceList.Where(z => z.Name.Contains("付款手续费") || z.Name.Contains("刷卡手续费") || z.Name.Contains("转账手续费")).ToList(); break;
                    //利息收入
                    case 42:
                        NewfinanceList = NewfinanceList.Where(z => z.Name.Contains("利息收入")).ToList(); break;
                    //汇兑损益
                    case 43:
                        NewfinanceList = NewfinanceList.Where(z => z.Name.Contains("汇兑损益")).ToList(); break;
                    //营业外收入
                    case 44:
                        NewfinanceList = NewfinanceList.Where(z => z.Name.Contains("营业外收入") || z.Name.Contains("商品收入") || z.Name.Contains("运费收入") || z.Name.Contains("司导保险收入")).ToList(); break;
                    //其他营业支出
                    case 48:
                        NewfinanceList = NewfinanceList.Where(z => z.Name.Contains("其他营业支出") || z.Name.Contains("退换货费用") || z.Name.Contains("采购成本") || z.Name.Contains("商品退款") || z.Name.Contains("税费") || z.Name.Contains("司导保险成本") || z.Name.Contains("采购退回") || z.Name.Contains("溢收款退款")).ToList(); break;
                    //所得税费用
                    case 49:
                        NewfinanceList = NewfinanceList.Where(z => z.Name.Contains("所得税费用")).ToList(); break;
                    //营业税金
                    case 50:
                        NewfinanceList = NewfinanceList.Where(z => z.Name.Contains("营业税金及附加")).ToList(); break;
                    //简易报表其他
                    case 51://&& !z.Name.Contains("营业外收入")
                        NewfinanceList = NewfinanceList.Where(z => !z.Name.Contains("所得税费用")
                        && !z.Name.Contains("其他营业支出")
                        && !z.Name.Contains("营业外收入")
                        && !z.Name.Contains("应付款")
                        && !z.Name.Contains("应收款")
                        && !z.Name.Contains("汇兑损益")
                        && !z.Name.Contains("利息收入")
                        && (!z.Name.Contains("付款手续费") && !z.Name.Contains("刷卡手续费") && !z.Name.Contains("转账手续费"))
                        && !z.Name.Contains("航空公司大订金(会抵扣)")
                        && !z.Name.Contains("航空公司保证金(会退)")
                        && !z.Name.Contains("领队佣金")
                        && !z.Name.Contains("领队奖励金")
                        && !z.Name.Contains("导游佣金")
                        && !z.Name.Contains("服务器管理费")
                        && !z.Name.Contains("律师费")
                        && !z.Name.Contains("工会经费")
                        && !z.Name.Contains("同行返利")
                        && !z.Name.Contains("平台大红包返款")
                        && !z.Name.Contains("会务费")
                        && !z.Name.Contains("团队建设费")
                        && !z.Name.Contains("市内交通费")
                        && !z.Name.Contains("電腦系统费")
                        && !z.Name.Contains("系统使用费")
                        && !z.Name.Contains("系统费")
                        && !z.Name.Contains("平台使用费")
                        && z.Name != "税金"
                        && !z.Name.Contains("累计折旧")
                        && !z.Name.Contains("业务招待")
                        && !z.Name.Contains("累计折旧")
                        && !z.Name.Contains("广告费")
                        && !z.Name.Contains("房租")
                        && !z.Name.Contains("物管水电费")
                        && !z.Name.Contains("电话费")
                        && !z.Name.Contains("通讯费")
                        && !z.Name.Contains("差旅费")
                        && !z.Name.Contains("办公用品")
                        && !z.Name.Contains("福利及奖金")
                        && !z.Name.Contains("社会保障费")
                        && !z.Name.Contains("业务提成")
                        && !z.Name.Contains("人头奖励")
                        && !z.Name.Contains("工资")
                        && !z.Name.Contains("旅游责任险")
                        && !z.Name.Contains("保险费")
                        && !z.Name.Contains("营业税金及附加")
                        && z.Type != WFTempLateClassEnum.ShouldIncome
                        && z.Type != WFTempLateClassEnum.ShouldPay
                        && !z.Name.Contains("投资款")
                        && !z.Name.Contains("利润分配")
                        && !z.Name.Contains("员工红利")
                        && !z.Name.Contains("酒店预付款")
                        && !z.Name.Contains("CHI包房")
                        && !z.Name.Contains("预付环球门票")
                        && !z.Name.Contains("门票预付款")
                        && !z.Name.Contains("餐厅预付款")
                        && !z.Name.Contains("车资预付款")
                        && !z.Name.Contains("机票预付款")
                        && !z.Name.Contains("电商预付款")
                        && !z.Name.Contains("保证金")
                        && !z.Name.Contains("其他保证金")
                        && !z.Name.Contains("机票保证金")
                        && !z.Name.Contains("押金")
                        && !z.Name.Contains("员工工资(还款)")
                        && !z.Name.Contains("挂账单冲抵")
                        && !z.Name.Contains("机票收入")
                        && !z.Name.Contains("快递费")
                        && !z.Name.Contains("照片服务费")
                        && !z.Name.Contains("地接OP备用金")
                        && !z.Name.Contains("领队罚金")
                        && !z.Name.Contains("景点门票")
                        && !z.Name.Contains("用房手配费")
                        && !z.Name.Contains("餐厅手配费")
                        && !z.Name.Contains("景点门票手配费")
                        && !z.Name.Contains("平台佣金")
                        && !z.Name.Contains("居间佣金")
                        && !z.Name.Contains("商品收入")
                        && !z.Name.Contains("运费收入")
                        && !z.Name.Contains("退换货费用")
                        && !z.Name.Contains("采购成本")
                        && !z.Name.Contains("运杂费")
                        && !z.Name.Contains("商品退款")
                        && !z.Name.Contains("电商存货")
                        && !z.Name.Contains("采购退回")
                        && !z.Name.Contains("溢收款退款")
                        && !z.Name.Contains("税费")
                        && !z.Name.Contains("司导保险收入")
                        && !z.Name.Contains("司导保险成本")
                        && !z.Name.Contains("备用金")
                        && !z.Name.Contains("个人借款")
                        && !z.Name.Contains("其他代垫代收")
                        && !z.Name.Contains("陈芳英款项")
                        ).ToList();
                        break;
                    //管销费用
                    case 57:
                        NewfinanceList = NewfinanceList.Where(z => (!z.Name.Contains("所得税费用")
                        && !z.Name.Contains("其他营业支出")
                        && !z.Name.Contains("营业外收入")
                        && !z.Name.Contains("应付款")
                        && !z.Name.Contains("应收款")
                        && !z.Name.Contains("汇兑损益")
                        && !z.Name.Contains("利息收入")
                        && !z.Name.Contains("旅游责任险")
                        && !z.Name.Contains("保险费")
                        && z.Type != WFTempLateClassEnum.ShouldIncome
                        && z.Type != WFTempLateClassEnum.ShouldPay
                        && !z.Name.Contains("投资款")
                        && !z.Name.Contains("利润分配")
                        && !z.Name.Contains("领队保证金")
                        && !z.Name.Contains("导游保证金")
                        && !z.Name.Contains("员工红利")
                        && !z.Name.Contains("平台保证金")
                        && !z.Name.Contains("其他保证金")
                        && !z.Name.Contains("挂账单冲抵")
                        && !z.Name.Contains("押金")) || (z.Name.Contains("快递费"))).ToList(); break;
                    //快递费
                    case 52:
                        NewfinanceList = NewfinanceList.Where(z => z.Name.Contains("快递费") || z.Name.Contains("运杂费")).ToList(); break;
                    ////营业总成本
                    //case 53:
                    //    NewfinanceList =NewfinanceList.Where(z => z.Name.Contains("邀请函") || z.Name.Contains("名单表") || z.Name.Contains("车资") || z.Name.Contains("签证") || z.Name.Contains("地接费(领取)") || z.Name.Contains("地接费(结算)")).ToList();
                    //    break;
                    //赔偿
                    case 54:
                        NewfinanceList = NewfinanceList.Where(z => z.Name.Contains("赔偿")).ToList();
                        break;
                    //应收款
                    case 55:
                        NewfinanceList = NewfinanceList.Where(z => z.Type == WFTempLateClassEnum.ShouldIncome).ToList(); break;
                    //应付款
                    case 56:
                        NewfinanceList = NewfinanceList.Where(z => z.Type == WFTempLateClassEnum.ShouldPay).ToList(); break;
                    //应收款投资
                    case 58:
                        NewfinanceList = NewfinanceList.Where(z => z.Type == WFTempLateClassEnum.IN && z.Name.Contains("投资款")).ToList(); break;
                    //应付款投资
                    case 59:
                        NewfinanceList = NewfinanceList.Where(z => z.Type == WFTempLateClassEnum.OUT && z.Name.Contains("投资款")).ToList(); break;
                    //收入利润分配
                    case 61:
                        NewfinanceList = NewfinanceList.Where(z => z.Type == WFTempLateClassEnum.IN && z.Name.Contains("利润分配")).ToList(); break;
                    //支出利润分配
                    case 62:
                        NewfinanceList = NewfinanceList.Where(z => z.Type == WFTempLateClassEnum.OUT && z.Name.Contains("利润分配")).ToList(); break;
                    //收入员工红利
                    case 63:
                        NewfinanceList = NewfinanceList.Where(z => z.Type == WFTempLateClassEnum.IN && z.Name.Contains("员工红利")).ToList(); break;
                    //支出员工红利
                    case 64:
                        NewfinanceList = NewfinanceList.Where(z => z.Type == WFTempLateClassEnum.OUT && z.Name.Contains("员工红利")).ToList(); break;
                    //收入预付款
                    case 73:
                        NewfinanceList = NewfinanceList.Where(z => z.Type == WFTempLateClassEnum.IN && z.Name.Contains("预付款")).ToList(); break;
                    //支出预付款
                    case 74:
                        NewfinanceList = NewfinanceList.Where(z => z.Type == WFTempLateClassEnum.OUT && z.Name.Contains("预付款")).ToList(); break;
                    //收入保证金.押金预付款
                    case 75:
                        NewfinanceList = NewfinanceList.Where(z => z.Type == WFTempLateClassEnum.IN && (z.Name.Contains("平台保证金") || z.Name.Contains("押金") || z.Name.Contains("机票保证金") || z.Name.Contains("其他保证金"))).ToList(); break;
                    //支出保证金.押金预付款
                    case 76:
                        NewfinanceList = NewfinanceList.Where(z => z.Type == WFTempLateClassEnum.OUT && (z.Name.Contains("平台保证金") || z.Name.Contains("押金") || z.Name.Contains("机票保证金") || z.Name.Contains("其他保证金"))).ToList(); break;
                    case 79://日本印象  手配费
                        NewfinanceList = NewfinanceList.Where(z => z.Type == WFTempLateClassEnum.IN && z.Name.Contains("用房手配费") && z.Name.Contains("餐厅手配费") && z.Name.Contains("景点门票手配费")).ToList(); break;
                    //电商居间佣金
                    case 80:
                        NewfinanceList = NewfinanceList.Where(z => z.Name.Contains("居间佣金")).ToList(); break;
                    //备用金
                    case 81:
                        NewfinanceList = NewfinanceList.Where(z => z.Type == WFTempLateClassEnum.IN && z.Name.Contains("备用金")).ToList(); break;
                    //备用金
                    case 82:
                        NewfinanceList = NewfinanceList.Where(z => z.Type == WFTempLateClassEnum.OUT && z.Name.Contains("备用金")).ToList(); break;
                    //个人借款
                    case 83:
                        NewfinanceList = NewfinanceList.Where(z => z.Type == WFTempLateClassEnum.IN && z.Name.Contains("个人借款")).ToList(); break;
                    //个人借款
                    case 84:
                        NewfinanceList = NewfinanceList.Where(z => z.Type == WFTempLateClassEnum.OUT && z.Name.Contains("个人借款")).ToList(); break;
                    //其他代垫代收
                    case 85:
                        NewfinanceList = NewfinanceList.Where(z => z.Type == WFTempLateClassEnum.IN && z.Name.Contains("其他代垫代收")).ToList(); break;
                    //其他代垫代收
                    case 86:
                        NewfinanceList = NewfinanceList.Where(z => z.Type == WFTempLateClassEnum.OUT && z.Name.Contains("其他代垫代收")).ToList(); break;
                    //陈芳英款项
                    case 87:
                        NewfinanceList = NewfinanceList.Where(z => z.Type == WFTempLateClassEnum.IN && z.Name.Contains("陈芳英款项")).ToList(); break;
                    //陈芳英款项
                    case 88:
                        NewfinanceList = NewfinanceList.Where(z => z.Type == WFTempLateClassEnum.OUT && z.Name.Contains("陈芳英款项")).ToList(); break;
                }
                if (NewfinanceList != null && NewfinanceList.Count() > 0)
                {
                    if (IsRCSZ)
                    {
                        Money = NewfinanceList.Where(y => y.Type == WFTempLateClassEnum.IN).Sum(x => x.Money.Value);
                        Fee = NewfinanceList.Where(x => x.Type == WFTempLateClassEnum.IN && x.Fee > 0).GroupBy(x => new { x.FrID, x.Fee }).Sum(x => x.Key.Fee ?? 0);
                        Money -= Fee;
                        Money = NewfinanceList.Where(y => y.Type == WFTempLateClassEnum.OUT).Sum(x => x.Money.Value) - Money;
                    }
                    else
                    {
                        if (Type == 9)
                        {
                            if (flag)
                            {
                                //收
                                Money = NewfinanceList.Where(y => y.Type == WFTempLateClassEnum.IN && y.Is_Cashier == 1).Sum(x => x.Money.Value);
                                Fee = NewfinanceList.Where(x => x.Type == WFTempLateClassEnum.IN && x.Is_Cashier == 1 && x.Fee > 0).GroupBy(x => new { x.FrID, x.Fee }).Sum(x => x.Key.Fee ?? 0);
                                Money -= Fee;
                                //支
                                Money = NewfinanceList.Where(y => y.Type == WFTempLateClassEnum.OUT && y.Is_Cashier == 1).Sum(x => x.Money.Value) - Money;
                            }
                            else
                            {
                                Money = NewfinanceList.Where(y => y.Type == WFTempLateClassEnum.IN).Sum(x => x.Money.Value);
                                Fee = NewfinanceList.Where(x => x.Type == WFTempLateClassEnum.IN && x.Fee > 0).GroupBy(x => new { x.FrID, x.Fee }).Sum(x => x.Key.Fee ?? 0);
                                Money -= Fee;
                                Money = NewfinanceList.Where(y => y.Type == WFTempLateClassEnum.OUT).Sum(x => x.Money.Value) - Money;
                            }
                        }
                        else if (Type == 66 || Type == 68 || Type == 70 || Type == 72 || Type == 74)
                        {
                            //预付款 冲抵
                            Money = NewfinanceList.Sum(x => x.Money.Value);
                            Fee = NewfinanceList.Where(x => x.Fee > 0).GroupBy(x => new { x.FrID, x.Fee }).Sum(x => x.Key.Fee ?? 0);
                            Money -= Fee;
                            var MatchList = NewfinanceList.Where(x => x.MatchMoney > 0).ToList();
                            if (MatchList.Count() > 0)
                            {
                                //减去冲抵的金额
                                var newFList = MatchList.Select(x => x.FrID).Distinct().ToList();
                                decimal DelMoney = 0;
                                foreach (var item in newFList)
                                {
                                    DelMoney += MatchList.Where(x => x.FrID == item).FirstOrDefault()?.MatchMoney ?? 0;
                                }
                                Money -= DelMoney;
                            }
                        }
                        else
                        {
                            if (flag)
                            {
                                Money = NewfinanceList.Where(y => y.Is_Cashier == 1).Sum(x => x.Money.Value);
                                Fee = NewfinanceList.Where(x => x.Is_Cashier == 1 && x.Fee > 0).GroupBy(x => new { x.FrID, x.Fee }).Sum(x => x.Key.Fee ?? 0);
                                Money -= Fee;
                            }
                            else
                            {
                                Money = NewfinanceList.Sum(x => x.Money.Value);
                                Fee = NewfinanceList.Where(x => x.Fee > 0).GroupBy(x => new { x.FrID, x.Fee }).Sum(x => x.Key.Fee ?? 0);
                                Money -= Fee;
                            }
                        }
                    }
                }
            }
            return Money;
        }

        public string GetCostIds(int Type, List<RB_Costtype_Extend> costList)
        {
            string ids = string.Empty;
            switch (Type)
            {
                //佣金收入
                case 1:
                    ids = string.Join(",", costList.Where(z => (z.Name.Contains("乳胶") || z.Name.Contains("御宝") || z.Name.Contains("乐天") || z.Name.Contains("茶道") || z.Name.Contains("高岛屋") || z.Name.Contains("TOKIS") || z.Name.Contains("电器LAOX") || z.Name.Contains("机场免税店") || z.Name.Contains("永山免税店") || z.Name.Contains("公社免税店") || z.Name.Contains("电器AKKYONE") || z.Name.Contains("橡胶店") || z.Name.Contains("琅勃拉邦古丝绸") || z.Name.Contains("老挝万象金沉香") || z.Name.Contains("老挝万象东盟珠宝") || z.Name.Contains("琅勃拉邦皇家乳胶") || z.Name.Contains("老挝土产") || z.Name.Contains("老挝红木") || z.Name.Contains("琅勃拉邦风情园") || z.Name.Contains("锅具") || z.Name.Contains("琅勃拉邦银寨") || z.Name.Contains("琅勃拉邦咖啡庄园") || z.Name.Contains("金占巴百草园"))).Select(x => x.ID + "").ToList());
                    break;
                //自费收入
                case 2:
                    ids = string.Join(",", costList.Where(z => z.Name.Contains("自费") || z.Name.Contains("自费收支结算")).Select(x => x.ID + "").ToList());
                    break;
                //小费收入
                case 3:
                    ids = string.Join(",", costList.Where(z => z.Name.Contains("小费")).Select(x => x.ID + "").ToList());
                    break;
                //佣金+小费+自费
                case 4:
                    ids = string.Join(",", costList.Where(z => z.Name.Contains("地接收入") || z.Name.Contains("小费") || z.Name.Contains("自费")).Select(x => x.ID + "").ToList());
                    break;
                //邀请函、名单表
                case 5:
                    ids = string.Join(",", costList.Where(z => z.Name.Contains("邀请函") || z.Name.Contains("名单表")).Select(x => x.ID + "").ToList());
                    break;
                //车资
                case 6:
                    ids = string.Join(",", costList.Where(z => z.Name.Contains("车资")).Select(x => x.ID + "").ToList()); break;
                //国内联运机票
                case 7:
                    ids = string.Join(",", costList.Where(z => z.Name.Contains("国内联运")).Select(x => x.ID + "").ToList()); break;
                //签证
                case 8:
                    ids = string.Join(",", costList.Where(z => z.Name.Contains("签证")).Select(x => x.ID + "").ToList()); break;
                //其他
                case 9:
                    ids = string.Join(",", costList.Where(z => !z.Name.Contains("邀请函") && !z.Name.Contains("名单表") && !z.Name.Contains("车资") && !z.Name.Contains("机票") && !z.Name.Contains("联运机票") && !z.Name.Contains("签证") && !z.Name.Contains("地接费(领取)") && !z.Name.Contains("地接费(结算)") && !z.Name.Contains("自费") && !z.Name.Contains("御宝") && !z.Name.Contains("乐天") && !z.Name.Contains("茶道") && !z.Name.Contains("高岛屋") && !z.Name.Contains("TOKIS") && !z.Name.Contains("电器LAOX") && !z.Name.Contains("机场免税店") && !z.Name.Contains("永山免税店") && !z.Name.Contains("公社免税店") && !z.Name.Contains("电器AKKONE") && !z.Name.Contains("橡胶店")).Select(x => x.ID + "").ToList());
                    break;
                case 10:
                    //地接款支出
                    ids = string.Join(",", costList.Where(z => z.Name.Contains("地接费(领取)")).Select(x => x.ID + "").ToList()); break;
                //地接款收入
                case 11:
                    ids = string.Join(",", costList.Where(z => z.Name.Contains("地接费(结算)")).Select(x => x.ID + "").ToList()); break;
                //小费收入
                case 12:
                    ids = string.Join(",", costList.Where(z => z.Name.Contains("小费")).Select(x => x.ID + "").ToList()); break;
                //自费收入
                case 13:
                    ids = string.Join(",", costList.Where(z => z.Name.Contains("自费")).Select(x => x.ID + "").ToList()); break;
                //简易报表
                //意外险
                case 14:
                    ids = string.Join(",", costList.Where(z => z.Name.Contains("保险费") || z.Name.Contains("旅游责任险")).Select(x => x.ID + "").ToList()); break;
                //工资
                case 15:
                    ids = string.Join(",", costList.Where(z => z.Name.Contains("工资") && !z.Name.Contains("员工工资(还款)")).Select(x => x.ID + "").ToList()); break;
                //员工提成
                case 16:
                    ids = string.Join(",", costList.Where(z => z.Name.Contains("业务提成(操作)") || z.Name.Contains("业务提成(签证)") || z.Name.Contains("业务提成(票务)") || z.Name.Contains("业务提成(地接)") || z.Name.Contains("业务提成(销售)") || z.Name.Contains("人头奖励(销售)")).Select(x => x.ID + "").ToList()); break;
                //社保
                case 17:
                    ids = string.Join(",", costList.Where(z => z.Name.Contains("社会保障费")).Select(x => x.ID + "").ToList()); break;
                //员工福利及竞赛奖金
                case 18:
                    ids = string.Join(",", costList.Where(z => z.Name.Contains("福利及奖金")).Select(x => x.ID + "").ToList()); break;
                //办公用品
                case 19:
                    ids = string.Join(",", costList.Where(z => z.Name.Contains("办公用品")).Select(x => x.ID + "").ToList()); break;
                //差旅费
                case 20:
                    ids = string.Join(",", costList.Where(z => z.Name.Contains("差旅费")).Select(x => x.ID + "").ToList()); break;
                //电话费(通訊費)
                case 21:
                    ids = string.Join(",", costList.Where(z => z.Name.Contains("电话费") || z.Name.Contains("通讯费")).Select(x => x.ID + "").ToList()); break;
                //物管水电费
                case 22:
                    ids = string.Join(",", costList.Where(z => z.Name.Contains("物管水电费")).Select(x => x.ID + "").ToList()); break;
                //房租
                case 23:
                    ids = string.Join(",", costList.Where(z => z.Name.Contains("房租")).Select(x => x.ID + "").ToList()); break;
                //广告费
                case 24:
                    ids = string.Join(",", costList.Where(z => z.Name.Contains("广告费")).Select(x => x.ID + "").ToList()); break;
                //业务招待
                case 25:
                    ids = string.Join(",", costList.Where(z => z.Name.Contains("业务招待")).Select(x => x.ID + "").ToList()); break;
                //累计折旧
                case 26:
                    ids = string.Join(",", costList.Where(z => z.Name.Contains("累计折旧")).Select(x => x.ID + "").ToList()); break;
                //税金
                case 27:
                    ids = string.Join(",", costList.Where(z => z.Name == "税金").Select(x => x.ID + "").ToList()); break;
                //平台使用费
                case 28:
                    ids = string.Join(",", costList.Where(z => z.Name.Contains("平台使用费")).Select(x => x.ID + "").ToList()); break;
                //電腦系统费
                case 29:
                    ids = string.Join(",", costList.Where(z => z.Name.Contains("電腦系统费") || z.Name.Contains("系统使用费")).Select(x => x.ID + "").ToList()); break;
                //市内交通费
                case 30:
                    ids = string.Join(",", costList.Where(z => z.Name.Contains("市内交通费")).Select(x => x.ID + "").ToList()); break;
                //团队建设费
                case 31:
                    ids = string.Join(",", costList.Where(z => z.Name.Contains("团队建设费")).Select(x => x.ID + "").ToList()); break;
                //会务费
                case 32:
                    ids = string.Join(",", costList.Where(z => z.Name.Contains("会务费")).Select(x => x.ID + "").ToList()); break;
                //同行返利
                case 33:
                    ids = string.Join(",", costList.Where(z => z.Name.Contains("同行返利") || z.Name.Contains("平台大红包返款") || z.Name.Contains("平台佣金")).Select(x => x.ID + "").ToList()); break;
                //工会经费
                case 34:
                    ids = string.Join(",", costList.Where(z => z.Name.Contains("工会经费")).Select(x => x.ID + "").ToList()); break;
                //律师费
                case 35:
                    ids = string.Join(",", costList.Where(z => z.Name.Contains("律师费")).Select(x => x.ID + "").ToList()); break;
                //服务器管理费
                case 36:
                    ids = string.Join(",", costList.Where(z => z.Name.Contains("服务器管理费")).Select(x => x.ID + "").ToList()); break;
                //导游佣金
                case 37:
                    ids = string.Join(",", costList.Where(z => z.Name.Contains("导游佣金")).Select(x => x.ID + "").ToList()); break;
                //领队佣金
                case 38:
                    ids = string.Join(",", costList.Where(z => z.Name.Contains("领队佣金") || z.Name.Contains("领队奖励金")).Select(x => x.ID + "").ToList()); break;
                //航空公司保证金(会退)
                case 39:
                    ids = string.Join(",", costList.Where(z => z.Name.Contains("航空公司保证金(会退)")).Select(x => x.ID + "").ToList()); break;
                //航空公司大订金(会抵扣)
                case 40:
                    ids = string.Join(",", costList.Where(z => z.Name.Contains("航空公司大订金(会抵扣)")).Select(x => x.ID + "").ToList()); break;
                //汇款手续费
                case 41:
                    ids = string.Join(",", costList.Where(z => z.Name.Contains("付款手续费") || z.Name.Contains("刷卡手续费") || z.Name.Contains("转账手续费")).Select(x => x.ID + "").ToList()); break;
                //利息收入
                case 42:
                    ids = string.Join(",", costList.Where(z => z.Name.Contains("利息收入")).Select(x => x.ID + "").ToList()); break;
                //汇兑损益
                case 43:
                    ids = string.Join(",", costList.Where(z => z.Name.Contains("汇兑损益")).Select(x => x.ID + "").ToList()); break;
                //营业外收入
                case 44:
                    ids = string.Join(",", costList.Where(z => z.Name.Contains("营业外收入") || z.Name.Contains("商品收入") || z.Name.Contains("运费收入") || z.Name.Contains("司导保险收入")).Select(x => x.ID + "").ToList()); break;
                //营业外收入1(公司日常收入单)
                case 45:
                //ids = string.Join(",", costList.Where(z => z.Name.Contains("营业外收入1")).Select(x => x.ID + "").ToList()); break;
                //应收款(老系统type=6)
                case 46:
                    ids = string.Join(",", costList.Where(z => z.Type == WFTempLateClassEnum.ShouldIncome || (z.Type == WFTempLateClassEnum.IN && (z.Name.Contains("投资款") || z.Name.Contains("平台保证金") || z.Name.Contains("押金") || z.Name.Contains("其他保证金")))).Select(x => x.ID + "").ToList()); break;
                //应付款(老系统type=7)
                case 47:
                    ids = string.Join(",", costList.Where(z => z.Type == WFTempLateClassEnum.ShouldPay || (z.Type == WFTempLateClassEnum.OUT && (z.Name.Contains("投资款") || z.Name.Contains("平台保证金") || z.Name.Contains("押金") || z.Name.Contains("其他保证金")))).Select(x => x.ID + "").ToList()); break;
                //其他营业支出
                case 48:
                    ids = string.Join(",", costList.Where(z => z.Name.Contains("其他营业支出") || z.Name.Contains("退换货费用") || z.Name.Contains("采购成本") || z.Name.Contains("商品退款") || z.Name.Contains("税费") || z.Name.Contains("司导保险成本") || z.Name.Contains("采购退回") || z.Name.Contains("溢收款退款")).Select(x => x.ID + "").ToList()); break;
                //所得税费用
                case 49:
                    ids = string.Join(",", costList.Where(z => z.Name.Contains("所得税费用")).Select(x => x.ID + "").ToList()); break;
                //营业税金
                case 50:
                    ids = string.Join(",", costList.Where(z => z.Name.Contains("营业税金及附加")).Select(x => x.ID + "").ToList()); break;
                //简易报表其他
                case 51:
                    ids = string.Join(",",
                        costList.Where(z => !z.Name.Contains("所得税费用")
                        && !z.Name.Contains("其他营业支出")
                        && !z.Name.Contains("应付款")
                        && !z.Name.Contains("应收款")
                        && !z.Name.Contains("营业外收入")
                        && !z.Name.Contains("汇兑损益")
                        && !z.Name.Contains("利息收入")
                        && (!z.Name.Contains("付款手续费")
                        && !z.Name.Contains("刷卡手续费")
                        && !z.Name.Contains("转账手续费"))
                        && !z.Name.Contains("航空公司大订金(会抵扣)")
                        && !z.Name.Contains("航空公司保证金(会退)")
                        && !z.Name.Contains("领队佣金")
                        && !z.Name.Contains("领队奖励金")
                        && !z.Name.Contains("导游佣金")
                        && !z.Name.Contains("服务器管理费")
                        && !z.Name.Contains("律师费")
                        && !z.Name.Contains("工会经费")
                        && !z.Name.Contains("同行返利")
                        && !z.Name.Contains("平台大红包返款")
                        && !z.Name.Contains("会务费")
                        && !z.Name.Contains("团队建设费")
                        && !z.Name.Contains("市内交通费")
                        && !z.Name.Contains("電腦系统费")
                        && !z.Name.Contains("系统使用费")
                        && !z.Name.Contains("系统费")
                        && !z.Name.Contains("平台使用费")
                        && z.Name != "税金"
                        && !z.Name.Contains("累计折旧")
                        && !z.Name.Contains("业务招待")
                        && !z.Name.Contains("累计折旧")
                        && !z.Name.Contains("广告费")
                        && !z.Name.Contains("房租")
                        && !z.Name.Contains("物管水电费")
                        && !z.Name.Contains("电话费")
                        && !z.Name.Contains("通讯费")
                        && !z.Name.Contains("差旅费")
                        && !z.Name.Contains("办公用品")
                        && !z.Name.Contains("福利及奖金")
                        && !z.Name.Contains("社会保障费")
                        && !z.Name.Contains("业务提成")
                        && !z.Name.Contains("人头奖励")
                        && !z.Name.Contains("工资")
                        && !z.Name.Contains("保险费")
                        && !z.Name.Contains("旅游责任险")
                        && !z.Name.Contains("营业税金及附加")
                        && z.Type != WFTempLateClassEnum.ShouldIncome
                        && z.Type != WFTempLateClassEnum.ShouldPay
                        && !z.Name.Contains("投资款")
                        && !z.Name.Contains("利润分配")
                        && !z.Name.Contains("员工红利")
                        && !z.Name.Contains("保证金")
                        && !z.Name.Contains("其他保证金")
                        && !z.Name.Contains("酒店预付款")
                        && !z.Name.Contains("CHI包房")
                        && !z.Name.Contains("预付环球门票")
                        && !z.Name.Contains("门票预付款")
                        && !z.Name.Contains("餐厅预付款")
                        && !z.Name.Contains("车资预付款")
                        && !z.Name.Contains("机票预付款")
                        && !z.Name.Contains("机票保证金")
                        && !z.Name.Contains("电商预付款")
                        && !z.Name.Contains("押金")
                        && !z.Name.Contains("员工工资(还款)")
                        && !z.Name.Contains("挂账单冲抵")
                        && !z.Name.Contains("机票收入")
                        && !z.Name.Contains("快递费")
                        && !z.Name.Contains("照片服务费")
                        && !z.Name.Contains("地接OP备用金")
                        && !z.Name.Contains("领队罚金")
                        && !z.Name.Contains("景点门票")
                        && !z.Name.Contains("用房手配费")
                        && !z.Name.Contains("餐厅手配费")
                        && !z.Name.Contains("景点门票手配费")
                        && !z.Name.Contains("平台佣金")
                        && !z.Name.Contains("居间佣金")
                        && !z.Name.Contains("商品收入")
                        && !z.Name.Contains("运费收入")
                        && !z.Name.Contains("退换货费用")
                        && !z.Name.Contains("采购成本")
                        && !z.Name.Contains("运杂费")
                        && !z.Name.Contains("商品退款")
                        && !z.Name.Contains("电商存货")
                        && !z.Name.Contains("采购退回")
                        && !z.Name.Contains("溢收款退款")
                        && !z.Name.Contains("税费")
                        && !z.Name.Contains("司导保险")
                        && !z.Name.Contains("备用金")
                        && !z.Name.Contains("个人借款")
                        && !z.Name.Contains("其他代垫代收")
                        && !z.Name.Contains("陈芳英款项")
                        ).Select(x => x.ID + "").ToList()); break;
                //快递费
                case 52:
                    ids = string.Join(",", costList.Where(z => z.Name.Contains("快递费") || z.Name.Contains("运杂费")).Select(x => x.ID + "").ToList()); break;
                //应收应付款
                case 53:
                    ids = string.Join(",", costList.Where(z => z.Type == WFTempLateClassEnum.ShouldIncome || z.Type == WFTempLateClassEnum.ShouldPay).Select(x => x.ID + "").ToList()); break;
                //应收应付款(投资款)
                case 55:
                    ids = string.Join(",", costList.Where(z => z.Name.Contains("投资款")).Select(x => x.ID + "").ToList()); break;
                //利润分配
                case 61:
                    ids = string.Join(",", costList.Where(z => z.Name.Contains("利润分配")).Select(x => x.ID + "").ToList()); break;
                //员工红利
                case 62:
                    ids = string.Join(",", costList.Where(z => z.Name.Contains("员工红利")).Select(x => x.ID + "").ToList()); break;
                //酒店预付款	
                case 63:
                    ids = string.Join(",", costList.Where(z => z.Name.Contains("酒店预付款") || z.Name.Contains("CHI包房")).Select(x => x.ID + "").ToList()); break;
                //门票预付款
                case 64:
                    ids = string.Join(",", costList.Where(z => z.Name.Contains("门票预付款") || z.Name.Contains("预付环球门票")).Select(x => x.ID + "").ToList()); break;
                //餐厅预付款
                case 65:
                    ids = string.Join(",", costList.Where(z => z.Name.Contains("餐厅预付款")).Select(x => x.ID + "").ToList()); break;
                //车资预付款
                case 66:
                    ids = string.Join(",", costList.Where(z => z.Name.Contains("预付款")).Select(x => x.ID + "").ToList()); break;
                //机票预付款
                case 67:
                    ids = string.Join(",", costList.Where(z => z.Name.Contains("机票预付款")).Select(x => x.ID + "").ToList()); break;
                //保证金押金预付款
                case 68:
                    ids = string.Join(",", costList.Where(z => z.Name.Contains("平台保证金") || z.Name.Contains("押金") || z.Name.Contains("机票保证金") || z.Name.Contains("其他保证金")).Select(x => x.ID + "").ToList()); break;
                //领队导游保证金
                case 69:
                    ids = string.Join(",", costList.Where(z => z.Name.Contains("领队保证金") || z.Name.Contains("导游保证金")).Select(x => x.ID + "").ToList()); break;
                //同行返利
                case 70:
                    ids = string.Join(",", costList.Where(z => z.Name.Contains("居间佣金")).Select(x => x.ID + "").ToList()); break;
                //备用金
                case 71:
                    ids = string.Join(",", costList.Where(z => z.Name.Contains("备用金")).Select(x => x.ID + "").ToList()); break;
                //个人借款
                case 72:
                    ids = string.Join(",", costList.Where(z => z.Name.Contains("个人借款")).Select(x => x.ID + "").ToList()); break;
                //其他代垫代收
                case 73:
                    ids = string.Join(",", costList.Where(z => z.Name.Contains("其他代垫代收")).Select(x => x.ID + "").ToList()); break;
                //陈芳英款项
                case 74:
                    ids = string.Join(",", costList.Where(z => z.Name.Contains("陈芳英款项")).Select(x => x.ID + "").ToList()); break;
            }
            return ids;
        }

        #endregion

        #region 业绩提成
        /// <summary>
        /// 获取订单提成明细
        /// </summary>
        /// <param name="orderIds"></param>
        /// <param name="group_Id"></param>
        /// <returns></returns>
        public List<RB_Sell_Achievements_Emp_ViewModel> GetAchListForOrderIds(string orderIds, int group_Id)
        {
            return sell_Achievements_EmpRepository.GetList(new RB_Sell_Achievements_Emp_ViewModel() { Group_Id = group_Id, OrderIds = orderIds });
        }

        /// <summary>
        /// 获取订单返佣列表
        /// </summary>
        /// <param name="orderIds"></param>
        /// <param name="group_Id"></param>
        /// <returns></returns>
        public List<RB_Order_ReturnComission_ViewModel> GetOrderReturnComissionList(string orderIds, int group_Id)
        {
            return order_ReturnComissionRepository.GetOrderReturnComissionListRepositpry(new RB_Order_ReturnComission_ViewModel() { QOrderIds = orderIds, GroupId = group_Id });
        }

        #endregion

        #region 月结窗口

        /// <summary>
        /// 月结设置分页列表
        /// </summary>
        /// <param name="pageIndex"></param>
        /// <param name="pageSize"></param>
        /// <param name="count"></param>
        /// <param name="dmodel"></param>
        /// <returns></returns>
        public List<RB_RollingAccount_Extend> GetFinanceMonthStatementPageList(int pageIndex, int pageSize, out long count, RB_RollingAccount_Extend dmodel)
        {
            var list = rollingAccountRepository.GetPageList(pageIndex, pageSize, out count, dmodel);
            if (list.Any()) {
                //查询校区
                List<int> SchoolIdList = JsonHelper.DeserializeObject<List<int>>("[" + string.Join(",", list.Select(x => x.SchoolIds)) + "]");
                string SchoolIds = string.Join(",", SchoolIdList.Where(x => x >= 0).Distinct().ToList());
                var schoolList = schoolRepository.GetSchoolListRepository(new Model.ViewModel.User.RB_School_ViewModel() { Group_Id = dmodel.GroupId, QSIds = SchoolIds });
                //查询创建人
                string userIds = string.Join(',', list.Select(x => x.UpdateBy).Distinct());
                var userList = accountRepository.GetEmployeeListRepository(new Model.ViewModel.User.Employee_ViewModel() { Group_Id = dmodel.GroupId, QIds = userIds });
                foreach (var item in list) {
                    item.UpdateByName = userList.Where(x => x.Id == item.UpdateBy).FirstOrDefault()?.EmployeeName ?? "";
                    item.SchoolList = new List<Model.ViewModel.User.RB_School_ViewModel>();
                    if (item.SchoolIds == "-1")
                    {
                        item.SchoolList.Add(new Model.ViewModel.User.RB_School_ViewModel()
                        {
                            SId = -1,
                            SName = "全部"
                        });
                    }
                    else {
                        List<int> SchoolId2List = JsonHelper.DeserializeObject<List<int>>("[" + item.SchoolIds + "]");
                        var sList = schoolList.Where(x => SchoolId2List.Contains(x.SId)).ToList();
                        item.SchoolList = sList;
                    }
                }
            }
            return list;
        }

        /// <summary>
        /// 新增/修改 月结设置
        /// </summary>
        /// <param name="dmodel"></param>
        /// <returns></returns>
        public string SetFinanceMonthStatementInfo(RB_RollingAccount_Extend dmodel)
        {
            if (dmodel.Id > 0)
            {
                //验证 除此之外  其他是否有包含
                var list = rollingAccountRepository.GetList(new RB_RollingAccount_Extend() { GroupId = dmodel.GroupId, Month = dmodel.Month });
                list = list.Where(x => x.Id != dmodel.Id).ToList();
                if (list.Any()) {
                    foreach (var item in dmodel.SchoolList) {
                        if (list.Where(x => ("," + x.SchoolIds + ",").Contains("," + item.SId + ",")).Any()) {
                            return item.SName + "已存在其他设置里,请核实后再试";
                        }
                    }
                }
                dmodel.SchoolIds = string.Join(",", dmodel.SchoolList.Select(x => x.SId));
                Dictionary<string, object> keyValues = new Dictionary<string, object>() {
                    { nameof(RB_RollingAccount_Extend.Month), dmodel.Month},
                    { nameof(RB_RollingAccount_Extend.SchoolIds), dmodel.SchoolIds},
                    { nameof(RB_RollingAccount_Extend.State), dmodel.State},
                    { nameof(RB_RollingAccount_Extend.UpdateBy), dmodel.UpdateBy},
                    { nameof(RB_RollingAccount_Extend.UpdateTime), dmodel.UpdateTime},
                };
                List<WhereHelper> wheres = new List<WhereHelper>() {
                    new WhereHelper(){
                         FiledName=nameof(RB_RollingAccount_Extend.Id),
                          FiledValue=dmodel.Id,
                           OperatorEnum=OperatorEnum.Equal
                    }
                };
                bool flag = rollingAccountRepository.Update(keyValues, wheres);
                return flag ? "" : "出错了,请联系管理员";
            }
            else {
                var list = rollingAccountRepository.GetList(new RB_RollingAccount_Extend() { GroupId = dmodel.GroupId, Month = dmodel.Month });
                if (list.Any())
                {
                    foreach (var item in dmodel.SchoolList)
                    {
                        if (list.Where(x => ("," + x.SchoolIds + ",").Contains("," + item.SId + ",")).Any())
                        {
                            return item.SName + "已存在其他设置里,请核实后再试";
                        }
                    }
                }
                dmodel.SchoolIds = string.Join(",", dmodel.SchoolList.Select(x => x.SId));
                bool flag = rollingAccountRepository.Insert(dmodel) >0;
                return flag ? "" : "出错了,请联系管理员";
            }
        }

        #endregion


        #region 报表统计  6.28

        /// <summary>
        /// 获取老师课时统计
        /// </summary>
        /// <param name="pageIndex"></param>
        /// <param name="pageSize"></param>
        /// <param name="count"></param>
        /// <param name="teacherId"></param>
        /// <param name="schoolId"></param>
        /// <param name="startMonth"></param>
        /// <param name="endMonth"></param>
        /// <returns></returns>
        public object GetTeacherConsumptionHoursStatistics(int pageIndex, int pageSize, out long count, int teacherId, int schoolId, string startMonth, string endMonth, int groupId)
        {
            List<object> RList = new List<object>();
            //首先查询所有的老师 + 助教
            var userList = accountRepository.GetEmployeePageListRepository(pageIndex, pageSize, out count, new Model.ViewModel.User.Employee_ViewModel() { Group_Id = groupId, AccountId = teacherId, School_Id = schoolId, IsHoursStatistics = 1, AccountTypeStr = "2", HoursStartTime = startMonth, HoursEndTime = endMonth });
            if (userList.Any())
            {
                //查询当前时间范围  这些老师的上课课时
                string userIds = string.Join(",", userList.Select(x => x.AccountId));
                var tTimeList = class_CheckRepository.GetTeacherHoursList(groupId, userIds, startMonth, endMonth);
                List<RB_Class_ViewModel> ClassList = new List<RB_Class_ViewModel>();
                if (tTimeList.Any()) {
                    //查询班级信息
                    string classIds = string.Join(",", tTimeList.Select(x => x.ClassId).Distinct());
                    ClassList = classRepository.GetClassListRepository(new RB_Class_ViewModel() { Group_Id = groupId, Q_ClassIds = classIds });
                }
                //班级类型查询
                var cTypeList = class_TypeRepository.GetClassTypeListRepository(new RB_Class_Type_ViewModel() { Group_Id = groupId });
                //查询期间  学生的上课总课时  + 合同课时单价
                var sTimeList = class_CheckRepository.GetStudentHoursList(groupId, userIds, startMonth, endMonth);
                //基础配置
                var configModel = class_ConfigRepository.GetClassConfigRepository(new RB_Class_Config_ViewModel() { Group_Id = groupId });
                if (configModel == null || configModel.BasicHourFee <= 0 || configModel.BasicMinutes <= 0) { return "未配置课时费基础设置"; }

                //根据学生id 
                //查询课时费 (要注意  需排除每个月老师的基础课时)
                foreach (var item in userList)
                {
                    var tlist = tTimeList.Where(x => x.TeacherId == item.AccountId).ToList();//多班级
                    int TotalStudyNum = tlist.Sum(x => x.StudyNum);
                    decimal ksNum = Math.Round(Convert.ToDecimal(TotalStudyNum) / configModel.BasicMinutes, 2, MidpointRounding.AwayFromZero); // 未达到一课时时间  算不算一课时
                    decimal Hours = Math.Round(Convert.ToDecimal(TotalStudyNum) / 60, 2, MidpointRounding.AwayFromZero);//小时
                    decimal KSMoney = 0;
                    foreach (var qitem in tlist) {
                        var classModel = ClassList.Where(x => x.ClassId == qitem.ClassId).FirstOrDefault();
                        var typeModel = cTypeList.Where(x => x.CTypeId == classModel.ClassType).FirstOrDefault();
                        //课时费  需要每个班级  单独计算  因为 班级有附加费用
                        KSMoney += Math.Round(Convert.ToDecimal(qitem.StudyNum) / configModel.BasicMinutes * (configModel.BasicHourFee + (typeModel?.AddHourFee ?? 0) + (item?.BaseHourFee ?? 0)), 2, MidpointRounding.AwayFromZero);
                    }
                    decimal StuMoney = Math.Round(sTimeList.Where(x => x.TeacherId == item.AccountId).Sum(x => x.CurrentDeductionHours * x.UnitPrice), 2, MidpointRounding.AwayFromZero);
                    RList.Add(new
                    {
                        item.Id,
                        item.AccountId,
                        item.EmployeeName,
                        LeaveStatus = item.LeaveStatus.ToName(),
                        KSNum = ksNum,
                        Hours,
                        KSMoney,
                        StuLearnMoney = StuMoney,
                        item.SchoolName
                    });
                }
            }
            return RList;
        }

        /// <summary>
        /// 获取老师课时汇总统计
        /// </summary>
        /// <param name="pageIndex"></param>
        /// <param name="pageSize"></param>
        /// <param name="count"></param>
        /// <param name="teacherId"></param>
        /// <param name="schoolId"></param>
        /// <param name="startMonth"></param>
        /// <param name="endMonth"></param>
        /// <param name="groupId"></param>
        /// <returns></returns>
        public object GetTeacherConsumptionHoursStatistics_V2(int pageIndex, int pageSize, out long count, int teacherId, int schoolId, string startMonth, string endMonth, int groupId)
        {
            List<object> RList = new List<object>();
            //首先查询所有的老师
            var userList = accountRepository.GetEmployeePageListRepository(pageIndex, pageSize, out count, new Model.ViewModel.User.Employee_ViewModel() { Group_Id = groupId, AccountId = teacherId, School_Id = schoolId, IsHoursStatistics = 1, AccountTypeStr = "2", HoursStartTime = startMonth, HoursEndTime = endMonth });
            if (userList.Any())
            {
                //班级类型查询
                var cTypeList = class_TypeRepository.GetClassTypeListRepository(new RB_Class_Type_ViewModel() { Group_Id = groupId });
                //基础配置
                var configModel = class_ConfigRepository.GetClassConfigRepository(new RB_Class_Config_ViewModel() { Group_Id = groupId });
                if (configModel == null || configModel.BasicHourFee <= 0 || configModel.BasicMinutes <= 0) { return RList; }

                //查询当前时间范围  这些老师的上课课时
                string userIds = string.Join(",", userList.Select(x => x.AccountId));
                List<RB_Teaching_BonusDetail_ViewModel> DateList = new List<RB_Teaching_BonusDetail_ViewModel>();
                //根据学生签到表  查询
                var list = class_CheckRepository.GetTeacherConsumptionHoursDetialList(userIds, schoolId, 0, startMonth, endMonth, groupId);
                if (list.Any())
                {
                    foreach (var item in list)
                    {
                        decimal ClassHourMinute = configModel.BasicMinutes;//课时分钟数
                        //if (item.ClassHourMinute > 0) { ClassHourMinute = item.ClassHourMinute; }
                        //上课课时
                        decimal KSNum = item.CurrentDeductionHours;//使用签到表的课时
                        if (item.ClassId == 18) { KSNum = 0; }//特殊班级处理
                        decimal Hours = Math.Round(KSNum * ClassHourMinute / 60, 2, MidpointRounding.AwayFromZero);//小时

                        var typeModel = cTypeList.Where(x => x.CTypeId == item.ClassType).FirstOrDefault();

                        decimal unitPrice = configModel.BasicHourFee + (typeModel?.AddHourFee ?? 0) + (item?.BaseHourFee ?? 0) + (item?.CourseAddHoursMoney ?? 0);
                        //课时费  需要每个班级  单独计算  因为 班级有附加费用
                        decimal KSMoney = KSNum * unitPrice;

                        decimal HourMoney = Math.Round(unitPrice / ClassHourMinute * 60, 2, MidpointRounding.AwayFromZero);//没小时课时费

                        DateList.Add(new RB_Teaching_BonusDetail_ViewModel
                        {
                            Date = item.ClassDate,
                            TimeBucket = item.StartDate + "~" + item.EndDate,
                            TeacherId = item.TeacherId,
                            TeacherName = item.TeacherName,
                            ClassId = item.ClassId,
                            ClassName = item.ClassName,
                            CouseId = item.CouseId,
                            CourseName = item.CourseName,
                            KSNum = KSNum,
                            Hours = Hours,
                            HourMoney = HourMoney,
                            UnitPrice = unitPrice,
                            Money = KSMoney,
                            CouseClassify = 1
                        });
                    }
                }

                //查询试听课
                var rclist = reserve_ClassRepository.GetTeacherHoursDetialList(userIds, schoolId, 0, startMonth, endMonth, groupId);
                if (rclist.Any()) {
                    decimal ClassHourMinute = configModel.BasicMinutes;//课时分钟数
                    decimal Hours = Math.Round(1 * ClassHourMinute / 60, 2, MidpointRounding.AwayFromZero);//小时
                    foreach (var item in rclist) {
                        DateList.Add(new RB_Teaching_BonusDetail_ViewModel
                        {
                            Date = item.ClassDate,
                            TimeBucket = item.ClassTime + "~" + item.EndTime,
                            TeacherId = item.TeacherId,
                            TeacherName = item.TeacherName,
                            ClassId = item.ReserveClassId,
                            ClassName = "试听课",
                            CouseId = item.TrialLessonId,
                            CourseName = item.LessonName,
                            KSNum = 1,
                            Hours = Hours,
                            HourMoney = Math.Round(item.ClassHourFee / Hours, 2, MidpointRounding.AwayFromZero),
                            UnitPrice = item.ClassHourFee,
                            Money = item.ClassHourFee,
                            CouseClassify = 2
                        });
                    }
                }

                //查询期间  学生的上课总课时  + 合同课时单价
                var sTimeList = class_CheckRepository.GetStudentHoursList(groupId, userIds, startMonth, endMonth);

                DateList = DateList.OrderBy(x => x.Date).ToList();
                //根据学生id 
                //查询课时费 (要注意  需排除每个月老师的基础课时)
                foreach (var item in userList)
                {
                    var tlist = DateList.Where(x => x.TeacherId == item.AccountId).ToList();//多班级

                    //初始化 基础课时
                    DateTime STime = Convert.ToDateTime(startMonth);
                    while (true)
                    {
                        DateTime ETime = STime.AddMonths(1).AddDays(-1);
                        var mlist = tlist.Where(x => x.Date >= STime && x.Date <= ETime).ToList();

                        #region 基础课时处理
                        decimal DeductionMoney = 0;
                        if (configModel.BasicHours > 0 && item.BaseHoursEnabled == 1 && STime >= Convert.ToDateTime(item.EnableTime))
                        {
                            //遍历所有老师
                            List<int> TeacherIdList = mlist.Select(x => x.TeacherId).Distinct().ToList();
                            foreach (var tId in TeacherIdList)
                            {
                                var qblist = mlist.Where(x => x.TeacherId == tId).OrderBy(x => x.Date).ThenBy(x => x.UnitPrice).ToList();
                                decimal BasicHours = (decimal)(configModel.BasicHours + item.BaseHoursAdd);
                                foreach (var qitem in qblist)
                                {
                                    decimal CourseHour = 0, DeductionHour = 0;
                                    if (BasicHours > qitem.KSNum)
                                    {
                                        DeductionHour = qitem.KSNum;
                                        BasicHours -= qitem.KSNum;
                                        DeductionMoney += qitem.KSNum * qitem.UnitPrice;
                                    }
                                    else
                                    {
                                        DeductionHour = BasicHours;
                                        CourseHour = qitem.KSNum - BasicHours;
                                        DeductionMoney += BasicHours * qitem.UnitPrice;
                                        BasicHours = 0;
                                    }
                                    qitem.KSNum = CourseHour;
                                    qitem.DKNum = DeductionHour;
                                    qitem.Money = CourseHour * qitem.UnitPrice;
                                    if (BasicHours <= 0)
                                    {
                                        break;
                                    }
                                }
                            }
                        }
                        #endregion

                        if (STime.Month == Convert.ToDateTime(endMonth).Month)
                        {
                            break;
                        }
                        STime = STime.AddMonths(1);
                    }

                    decimal ksNum = tlist.Sum(x => x.KSNum);
                    decimal dkNum = tlist.Sum(x => x.DKNum);
                    decimal Hours = tlist.Sum(x => x.Hours);
                    decimal KSMoney = tlist.Sum(x => x.Money);

                    decimal StuMoney = Math.Round(sTimeList.Where(x => x.TeacherId == item.AccountId).Sum(x => x.CurrentDeductionHours * x.UnitPrice), 2, MidpointRounding.AwayFromZero);
                    RList.Add(new
                    {
                        item.Id,
                        item.AccountId,
                        item.EmployeeName,
                        LeaveStatus = item.LeaveStatus.ToName(),
                        KSNum = ksNum,
                        DKNum = dkNum,
                        Hours,
                        KSMoney,
                        StuLearnMoney = StuMoney,
                        item.SchoolName
                    });
                }
            }
            return RList;
        }

        /// <summary>
        /// 导出Excel
        /// </summary>
        /// <param name="teacherId"></param>
        /// <param name="schoolId"></param>
        /// <param name="startMonth"></param>
        /// <param name="endMonth"></param>
        /// <param name="groupId"></param>
        /// <returns></returns>
        public List<ExcelDataSource> GetTeacherConsumptionHoursStatisticsToExcel(int teacherId, int schoolId, string startMonth, string endMonth, int groupId)
        {
            List<ExcelDataSource> RList = new List<ExcelDataSource>();
            //首先查询所有的老师 + 助教
            var userList = accountRepository.GetEmployeeListRepository(new Model.ViewModel.User.Employee_ViewModel() { Group_Id = groupId, AccountId = teacherId, School_Id = schoolId, IsHoursStatistics = 1, AccountTypeStr = "2", HoursStartTime = startMonth, HoursEndTime = endMonth });
            if (userList.Any())
            {
                //班级类型查询
                var cTypeList = class_TypeRepository.GetClassTypeListRepository(new RB_Class_Type_ViewModel() { Group_Id = groupId });
                //基础配置
                var configModel = class_ConfigRepository.GetClassConfigRepository(new RB_Class_Config_ViewModel() { Group_Id = groupId });
                if (configModel == null || configModel.BasicHourFee <= 0 || configModel.BasicMinutes <= 0) { return new List<ExcelDataSource>(); }

                //查询当前时间范围  这些老师的上课课时
                string userIds = string.Join(",", userList.Select(x => x.AccountId));
                List<RB_Teaching_BonusDetail_ViewModel> DateList = new List<RB_Teaching_BonusDetail_ViewModel>();
                //根据学生签到表  查询
                var list = class_CheckRepository.GetTeacherConsumptionHoursDetialList(userIds, schoolId, 0, startMonth, endMonth, groupId);
                if (list.Any())
                {
                    foreach (var item in list)
                    {
                        decimal ClassHourMinute = configModel.BasicMinutes;//课时分钟数
                        //if (item.ClassHourMinute > 0) { ClassHourMinute = item.ClassHourMinute; }
                        //上课课时
                        decimal KSNum = item.CurrentDeductionHours;//使用签到表课时
                        if (item.ClassId == 18) { KSNum = 0; }//特殊班级处理
                        decimal Hours = Math.Round(KSNum * ClassHourMinute / 60, 2, MidpointRounding.AwayFromZero);//小时

                        var typeModel = cTypeList.Where(x => x.CTypeId == item.ClassType).FirstOrDefault();

                        decimal unitPrice = configModel.BasicHourFee + (typeModel?.AddHourFee ?? 0) + (item?.BaseHourFee ?? 0) + (item?.CourseAddHoursMoney ?? 0);
                        //课时费  需要每个班级  单独计算  因为 班级有附加费用
                        decimal KSMoney = KSNum * unitPrice;

                        decimal HourMoney = Math.Round(unitPrice / ClassHourMinute * 60, 2, MidpointRounding.AwayFromZero);//没小时课时费

                        DateList.Add(new RB_Teaching_BonusDetail_ViewModel
                        {
                            Date = item.ClassDate,
                            TimeBucket = item.StartDate + "~" + item.EndDate,
                            TeacherId = item.TeacherId,
                            TeacherName = item.TeacherName,
                            ClassId = item.ClassId,
                            ClassName = item.ClassName,
                            CouseId = item.CouseId,
                            CourseName = item.CourseName,
                            KSNum = KSNum,
                            Hours = Hours,
                            HourMoney = HourMoney,
                            UnitPrice = unitPrice,
                            Money = KSMoney
                        });
                    }
                }

                //查询试听课
                var rclist = reserve_ClassRepository.GetTeacherHoursDetialList(userIds, schoolId, 0, startMonth, endMonth, groupId);
                if (rclist.Any())
                {
                    decimal ClassHourMinute = configModel.BasicMinutes;//课时分钟数
                    decimal Hours = Math.Round(1 * ClassHourMinute / 60, 2, MidpointRounding.AwayFromZero);//小时
                    foreach (var item in rclist)
                    {
                        DateList.Add(new RB_Teaching_BonusDetail_ViewModel
                        {
                            Date = item.ClassDate,
                            TimeBucket = item.ClassTime + "~" + item.EndTime,
                            TeacherId = item.TeacherId,
                            TeacherName = item.TeacherName,
                            ClassId = item.ReserveClassId,
                            ClassName = "试听课",
                            CouseId = item.TrialLessonId,
                            CourseName = item.LessonName,
                            KSNum = 1,
                            Hours = Hours,
                            HourMoney = Math.Round(item.ClassHourFee / Hours, 2, MidpointRounding.AwayFromZero),
                            UnitPrice = item.ClassHourFee,
                            Money = item.ClassHourFee,
                            CouseClassify = 2
                        });
                    }
                }

                DateList = DateList.OrderBy(x => x.Date).ToList();

                //查询期间  学生的上课总课时  + 合同课时单价
                var sTimeList = class_CheckRepository.GetStudentHoursList(groupId, userIds, startMonth, endMonth);

                //根据学生id 
                //查询课时费 (要注意  需排除每个月老师的基础课时)
                int Num = 1;
                decimal TKSNum = 0, TDKNum = 0, TStuMoney = 0, THours = 0, TKSMoney = 0;

                foreach (var item in userList)
                {
                    var tlist = DateList.Where(x => x.TeacherId == item.AccountId).ToList();//多班级

                    //初始化 基础课时
                    DateTime STime = Convert.ToDateTime(startMonth);
                    while (true)
                    {
                        DateTime ETime = STime.AddMonths(1).AddDays(-1);
                        var mlist = tlist.Where(x => x.Date >= STime && x.Date <= ETime).ToList();

                        #region 基础课时处理
                        decimal DeductionMoney = 0;
                        if (configModel.BasicHours > 0 && item.BaseHoursEnabled == 1 && STime >= Convert.ToDateTime(item.EnableTime))
                        {
                            //遍历所有老师
                            List<int> TeacherIdList = mlist.Select(x => x.TeacherId).Distinct().ToList();
                            foreach (var tId in TeacherIdList)
                            {
                                var qblist = mlist.Where(x => x.TeacherId == tId).OrderBy(x => x.Date).ThenBy(x => x.UnitPrice).ToList();
                                decimal BasicHours = (decimal)(configModel.BasicHours + item.BaseHoursAdd);
                                foreach (var qitem in qblist)
                                {
                                    decimal CourseHour = 0, DeductionHour = 0;
                                    if (BasicHours > qitem.KSNum)
                                    {
                                        DeductionHour = qitem.KSNum;
                                        BasicHours -= qitem.KSNum;
                                        DeductionMoney += qitem.KSNum * qitem.UnitPrice;
                                    }
                                    else
                                    {
                                        DeductionHour = BasicHours;
                                        CourseHour = qitem.KSNum - BasicHours;
                                        DeductionMoney += BasicHours * qitem.UnitPrice;
                                        BasicHours = 0;
                                    }
                                    qitem.KSNum = CourseHour;
                                    qitem.DKNum = DeductionHour;
                                    qitem.Money = CourseHour * qitem.UnitPrice;
                                    if (BasicHours <= 0)
                                    {
                                        break;
                                    }
                                }
                            }
                        }
                        #endregion

                        if (STime.Month == Convert.ToDateTime(endMonth).Month)
                        {
                            break;
                        }
                        STime = STime.AddMonths(1);
                    }

                    decimal ksNum = tlist.Sum(x => x.KSNum);
                    decimal dkNum = tlist.Sum(x => x.DKNum);
                    decimal Hours = tlist.Sum(x => x.Hours);
                    decimal KSMoney = tlist.Sum(x => x.Money);

                    decimal StuMoney = Math.Round(sTimeList.Where(x => x.TeacherId == item.AccountId).Sum(x => x.CurrentDeductionHours * x.UnitPrice), 2, MidpointRounding.AwayFromZero);


                    ExcelDataSource firstRow = new ExcelDataSource(30)
                    {
                        ExcelRows = new List<ExcelColumn>()
                        {
                            new ExcelColumn(value: Num.ToString()){ },
                            new ExcelColumn(value: item.SchoolName){ },
                            new ExcelColumn(value: item.LeaveStatus.ToName()){ },
                            new ExcelColumn(value: item.EmployeeName){ },
                            new ExcelColumn(value: ksNum.ToString("#0.00")){ },
                            new ExcelColumn(value: dkNum.ToString("#0.00")){ },
                            new ExcelColumn(value: StuMoney.ToString("#0.00")){ },
                            new ExcelColumn(value: Hours.ToString("#0.00")){ },
                            new ExcelColumn(value: KSMoney.ToString("#0.00")){ }
                        }
                    };
                    RList.Add(firstRow);
                    Num++;
                    TKSNum += ksNum;
                    TDKNum += dkNum;
                    TStuMoney += StuMoney;
                    THours += Hours;
                    TKSMoney += KSMoney;
                }

                ExcelDataSource firstRowT = new ExcelDataSource(30)
                {
                    ExcelRows = new List<ExcelColumn>()
                    {
                        new ExcelColumn(value: "合计"){ },
                        new ExcelColumn(value: ""){ },
                        new ExcelColumn(value: ""){ },
                        new ExcelColumn(value: ""){ },
                        new ExcelColumn(value: TKSNum.ToString("#0.00")){ },
                        new ExcelColumn(value: TDKNum.ToString("#0.00")){ },
                        new ExcelColumn(value: TStuMoney.ToString("#0.00")){ },
                        new ExcelColumn(value: THours.ToString("#0.00")){ },
                        new ExcelColumn(value: TKSMoney.ToString("#0.00")){ }
                    }
                };
                RList.Add(firstRowT);
            }
            return RList;
        }

        /// <summary>
        /// 获取老师课时统计明细列表
        /// </summary>
        /// <param name="pageIndex"></param>
        /// <param name="pageSize"></param>
        /// <param name="count"></param>
        /// <param name="teacherId"></param>
        /// <param name="schoolId"></param>
        /// <param name="classId"></param>
        /// <param name="startMonth"></param>
        /// <param name="endMonth"></param>
        /// <param name="group_Id"></param>
        /// <returns></returns>
        public List<RB_Teaching_BonusDetail_ViewModel> GetTeacherConsumptionHoursDetialPageList(int pageIndex, int pageSize, out long count, int teacherId, int schoolId, int classId, string startMonth, string endMonth, int groupId)
        {
            List<RB_Teaching_BonusDetail_ViewModel> RList = new List<RB_Teaching_BonusDetail_ViewModel>();
            //根据学生签到表  查询
            var list = class_CheckRepository.GetTeacherConsumptionHoursDetialPageList(pageIndex, pageSize, out count, teacherId, schoolId, classId, startMonth, endMonth, groupId);
            var rclist = new List<Model.ViewModel.Reserve.RB_Reserve_Class_Extend>();
            if (pageSize == 1000 || pageSize == 10000) {
                //查询试听课
                rclist = reserve_ClassRepository.GetTeacherHoursDetialList(teacherId > 0 ? teacherId.ToString() : "", schoolId, 0, startMonth, endMonth, groupId);
            }
            if (list.Any() || rclist.Any()) {
                //班级类型查询
                var cTypeList = class_TypeRepository.GetClassTypeListRepository(new RB_Class_Type_ViewModel() { Group_Id = groupId });
                //基础配置
                var configModel = class_ConfigRepository.GetClassConfigRepository(new RB_Class_Config_ViewModel() { Group_Id = groupId });
                if (configModel == null || configModel.BasicHourFee <= 0 || configModel.BasicMinutes <= 0) { return RList; }

                foreach (var item in list) {
                    decimal ClassHourMinute = configModel.BasicMinutes;//课时分钟数
                    //if (item.ClassHourMinute > 0) { ClassHourMinute = item.ClassHourMinute; }
                    //上课课时
                    decimal KSNum = item.CurrentDeductionHours;//课时直接取这里的了, 这个可手动调整了;
                    if (item.ClassId == 18) { KSNum = 0; }//特殊班级处理
                    decimal Hours = Math.Round(KSNum * ClassHourMinute / 60, 2, MidpointRounding.AwayFromZero);//小时

                    var typeModel = cTypeList.Where(x => x.CTypeId == item.ClassType).FirstOrDefault();

                    decimal unitPrice = configModel.BasicHourFee + (typeModel?.AddHourFee ?? 0) + (item?.BaseHourFee ?? 0) + (item?.CourseAddHoursMoney ?? 0);
                    //课时费  需要每个班级  单独计算  因为 班级有附加费用
                    decimal KSMoney = KSNum * unitPrice;

                    decimal HourMoney = Math.Round(unitPrice / ClassHourMinute * 60, 2, MidpointRounding.AwayFromZero);//每小时课时费


                    RList.Add(new RB_Teaching_BonusDetail_ViewModel
                    {
                        Date = item.ClassDate,
                        TimeBucket = item.StartDate + "~" + item.EndDate,
                        TeacherId = item.TeacherId,
                        TeacherName = item.TeacherName,
                        ClassId = item.ClassId,
                        ClassName = item.ClassName,
                        ClassNo = item.ClassNo,
                        CouseId = item.CouseId,
                        CourseName = item.CourseName,
                        KSNum = KSNum,
                        Hours = Hours,
                        HourMoney = HourMoney,
                        UnitPrice = unitPrice,
                        Money = KSMoney,
                        BaseHoursEnabled = item.BaseHoursEnabled,
                        EnableTime = item.EnableTime,
                        BaseHoursAdd = item.BaseHoursAdd,
                        SName = item.SName
                    });
                }

                //试听课
                if (rclist.Any())
                {
                    decimal ClassHourMinute = configModel.BasicMinutes;//课时分钟数
                    decimal Hours = Math.Round(1 * ClassHourMinute / 60, 2, MidpointRounding.AwayFromZero);//小时
                    foreach (var item in rclist)
                    {
                        RList.Add(new RB_Teaching_BonusDetail_ViewModel
                        {
                            Date = item.ClassDate,
                            TimeBucket = item.ClassTime + "~" + item.EndTime,
                            TeacherId = item.TeacherId,
                            TeacherName = item.TeacherName,
                            ClassId = item.ReserveClassId,
                            ClassName = "试听课",
                            CouseId = item.TrialLessonId,
                            CourseName = item.LessonName,
                            KSNum = 1,
                            Hours = Hours,
                            HourMoney = Math.Round(item.ClassHourFee / Hours, 2, MidpointRounding.AwayFromZero),
                            UnitPrice = item.ClassHourFee,
                            Money = item.ClassHourFee,
                            CouseClassify = 2,
                            BaseHoursEnabled = item.BaseHoursEnabled,
                            EnableTime = item.EnableTime,
                            BaseHoursAdd = item.BaseHoursAdd,
                            SName = item.SName
                        });
                    }
                }

                RList = RList.OrderBy(x => x.Date).ToList();

                //初始化 基础课时
                DateTime STime = Convert.ToDateTime(startMonth);
                while (true)
                {
                    DateTime ETime = STime.AddMonths(1).AddDays(-1);
                    var mlist = RList.Where(x => x.Date >= STime && x.Date <= ETime && x.BaseHoursEnabled == 1 && STime >= Convert.ToDateTime(x.EnableTime)).ToList();
                    #region 基础课时处理
                    decimal DeductionMoney = 0;
                    if (configModel.BasicHours > 0 && mlist.Any())
                    {
                        //遍历所有老师
                        List<int> TeacherIdList = mlist.Select(x => x.TeacherId).Distinct().ToList();
                        foreach (var item in TeacherIdList)
                        {
                            var qblist = mlist.Where(x => x.TeacherId == item).OrderBy(x => x.Date).ThenBy(x => x.UnitPrice).ToList();
                            decimal BasicHours = (decimal)(configModel.BasicHours + (mlist.FirstOrDefault()?.BaseHoursAdd ?? 0));
                            foreach (var qitem in qblist)
                            {
                                decimal CourseHour = 0, DeductionHour = 0;
                                if (BasicHours > qitem.KSNum)
                                {
                                    DeductionHour = qitem.KSNum;
                                    BasicHours -= qitem.KSNum;
                                    DeductionMoney += qitem.KSNum * qitem.UnitPrice;
                                }
                                else
                                {
                                    DeductionHour = BasicHours;
                                    CourseHour = qitem.KSNum - BasicHours;
                                    DeductionMoney += BasicHours * qitem.UnitPrice;
                                    BasicHours = 0;
                                }
                                qitem.KSNum = CourseHour;
                                qitem.DKNum = DeductionHour;
                                qitem.Money = CourseHour * qitem.UnitPrice;
                                if (BasicHours <= 0)
                                {
                                    break;
                                }
                            }
                        }
                    }
                    #endregion

                    if (STime.Month == Convert.ToDateTime(endMonth).Month)
                    {
                        break;
                    }
                    STime = STime.AddMonths(1);
                }
            }
            return RList;
        }

        /// <summary>
        /// 导出excel
        /// </summary>
        /// <param name="teacherId"></param>
        /// <param name="schoolId"></param>
        /// <param name="classId"></param>
        /// <param name="startMonth"></param>
        /// <param name="endMonth"></param>
        /// <param name="groupId"></param>
        /// <returns></returns>
        public List<ExcelDataSource> GetTeacherConsumptionHoursDetialPageListToExcel(int teacherId, int schoolId, int classId, string startMonth, string endMonth, int groupId)
        {
            List<ExcelDataSource> RDateList = new List<ExcelDataSource>();
            List<RB_Teaching_BonusDetail_ViewModel> RList = new List<RB_Teaching_BonusDetail_ViewModel>();
            //根据学生签到表  查询
            var list = class_CheckRepository.GetTeacherConsumptionHoursDetialList(teacherId.ToString(), schoolId, classId, startMonth, endMonth, groupId);
            //查询试听课
            var rclist = reserve_ClassRepository.GetTeacherHoursDetialList(teacherId > 0 ? teacherId.ToString() : "", schoolId, 0, startMonth, endMonth, groupId);
            if (list.Any() || rclist.Any())
            {
                //班级类型查询
                var cTypeList = class_TypeRepository.GetClassTypeListRepository(new RB_Class_Type_ViewModel() { Group_Id = groupId });
                //基础配置
                var configModel = class_ConfigRepository.GetClassConfigRepository(new RB_Class_Config_ViewModel() { Group_Id = groupId });
                if (configModel == null || configModel.BasicHourFee <= 0 || configModel.BasicMinutes <= 0) { return RDateList; }
                decimal TKSNum = 0, TDKNum = 0, THourMoney = 0, THours = 0, TKSMoney = 0;
                foreach (var item in list)
                {
                    decimal ClassHourMinute = configModel.BasicMinutes;//课时分钟数
                    //if (item.ClassHourMinute > 0) { ClassHourMinute = item.ClassHourMinute; }
                    //上课课时
                    decimal KSNum = item.CurrentDeductionHours;
                    if (item.ClassId == 18) { KSNum = 0; }//特殊班级处理
                    decimal Hours = Math.Round(KSNum * ClassHourMinute / 60, 2, MidpointRounding.AwayFromZero);//小时

                    var typeModel = cTypeList.Where(x => x.CTypeId == item.ClassType).FirstOrDefault();

                    decimal unitPrice = configModel.BasicHourFee + (typeModel?.AddHourFee ?? 0) + (item?.BaseHourFee ?? 0) + (item?.CourseAddHoursMoney ?? 0);
                    //课时费  需要每个班级  单独计算  因为 班级有附加费用
                    decimal KSMoney = KSNum * unitPrice;

                    decimal HourMoney = Math.Round(unitPrice / ClassHourMinute * 60, 2, MidpointRounding.AwayFromZero);//没小时课时费

                    RList.Add(new RB_Teaching_BonusDetail_ViewModel
                    {
                        Date = item.ClassDate,
                        TimeBucket = item.StartDate + "~" + item.EndDate,
                        TeacherId = item.TeacherId,
                        TeacherName = item.TeacherName,
                        ClassId = item.ClassId,
                        ClassName = item.ClassName,
                        ClassNo = item.ClassNo,
                        CouseId = item.CouseId,
                        CourseName = item.CourseName,
                        KSNum = KSNum,
                        Hours = Hours,
                        HourMoney = HourMoney,
                        UnitPrice = unitPrice,
                        Money = KSMoney,
                        BaseHoursEnabled = item.BaseHoursEnabled,
                        EnableTime = item.EnableTime,
                        SName = item.SName
                    });
                }

                //试听课
                if (rclist.Any())
                {
                    decimal ClassHourMinute = configModel.BasicMinutes;//课时分钟数
                    decimal Hours = Math.Round(1 * ClassHourMinute / 60, 2, MidpointRounding.AwayFromZero);//小时
                    foreach (var item in rclist)
                    {
                        RList.Add(new RB_Teaching_BonusDetail_ViewModel
                        {
                            Date = item.ClassDate,
                            TimeBucket = item.ClassTime + "~" + item.EndTime,
                            TeacherId = item.TeacherId,
                            TeacherName = item.TeacherName,
                            ClassId = item.ReserveClassId,
                            ClassName = "试听课",
                            CouseId = item.TrialLessonId,
                            CourseName = item.LessonName,
                            KSNum = 1,
                            Hours = Hours,
                            HourMoney = Math.Round(item.ClassHourFee / Hours, 2, MidpointRounding.AwayFromZero),
                            UnitPrice = item.ClassHourFee,
                            Money = item.ClassHourFee,
                            CouseClassify = 2,
                            BaseHoursEnabled = item.BaseHoursEnabled,
                            EnableTime = item.EnableTime,
                            SName = item.SName
                        });
                    }
                }

                RList = RList.OrderBy(x => x.Date).ToList();

                //初始化 基础课时
                DateTime STime = Convert.ToDateTime(startMonth);
                while (true)
                {
                    DateTime ETime = STime.AddMonths(1).AddDays(-1);
                    var mlist = RList.Where(x => x.Date >= STime && x.Date <= ETime && x.BaseHoursEnabled == 1 && STime >= Convert.ToDateTime(x.EnableTime)).ToList();

                    #region 基础课时处理
                    decimal DeductionMoney = 0;
                    if (configModel.BasicHours > 0 && mlist.Any())
                    {
                        //遍历所有老师
                        List<int> TeacherIdList = mlist.Select(x => x.TeacherId).Distinct().ToList();
                        foreach (var item in TeacherIdList)
                        {
                            var qblist = mlist.Where(x => x.TeacherId == item).OrderBy(x => x.Date).ThenBy(x => x.UnitPrice).ToList();
                            decimal BasicHours = (decimal)(configModel.BasicHours + (mlist.FirstOrDefault()?.BaseHoursAdd ?? 0));
                            foreach (var qitem in qblist)
                            {
                                decimal CourseHour = 0, DeductionHour = 0;
                                if (BasicHours > qitem.KSNum)
                                {
                                    DeductionHour = qitem.KSNum;
                                    BasicHours -= qitem.KSNum;
                                    DeductionMoney += qitem.KSNum * qitem.UnitPrice;
                                }
                                else
                                {
                                    DeductionHour = BasicHours;
                                    CourseHour = qitem.KSNum - BasicHours;
                                    DeductionMoney += BasicHours * qitem.UnitPrice;
                                    BasicHours = 0;
                                }
                                qitem.KSNum = CourseHour;
                                qitem.DKNum = DeductionHour;
                                qitem.Money = CourseHour * qitem.UnitPrice;
                                if (BasicHours <= 0)
                                {
                                    break;
                                }
                            }
                        }
                    }
                    #endregion

                    if (STime.Month == Convert.ToDateTime(endMonth).Month)
                    {
                        break;
                    }
                    STime = STime.AddMonths(1);
                }

                foreach (var item in RList) {
                    ExcelDataSource firstRow = new ExcelDataSource(30)
                    {
                        ExcelRows = new List<ExcelColumn>()
                        {
                            new ExcelColumn(value: item.Date.ToString("yyyy-MM-dd")){ },
                            new ExcelColumn(value: item.TimeBucket){ },
                            new ExcelColumn(value: item.SName){ },
                            new ExcelColumn(value: item.ClassNo){ },
                            new ExcelColumn(value: item.ClassName){ },
                            new ExcelColumn(value: item.CourseName){ },
                            new ExcelColumn(value: item.TeacherName){ },
                            new ExcelColumn(value: item.UnitPrice.ToString("#0.00")){ },
                            new ExcelColumn(value: item.KSNum.ToString("#0.00")){ },
                            new ExcelColumn(value: item.DKNum.ToString("#0.00")){ },
                            new ExcelColumn(value: item.Hours.ToString("#0.00")){ },
                            new ExcelColumn(value: item.HourMoney.ToString("#0.00")){ },
                            new ExcelColumn(value: item.Money.ToString("#0.00")){ }
                        }
                    };
                    RDateList.Add(firstRow);
                    TKSNum += item.KSNum;
                    TDKNum += item.DKNum;
                    THourMoney += item.HourMoney;
                    THours += item.Hours;
                    TKSMoney += item.Money;
                }

                ExcelDataSource firstRowT = new ExcelDataSource(30)
                {
                    ExcelRows = new List<ExcelColumn>()
                        {
                            new ExcelColumn(value: "合计"){ },
                            new ExcelColumn(value: ""){ },
                            new ExcelColumn(value: ""){ },
                            new ExcelColumn(value: ""){ },
                            new ExcelColumn(value: ""){ },
                            new ExcelColumn(value: ""){ },
                            new ExcelColumn(value: ""){ },
                            new ExcelColumn(value: ""){ },
                            new ExcelColumn(value: TKSNum.ToString("#0.00")){ },
                            new ExcelColumn(value: TDKNum.ToString("#0.00")){ },
                            new ExcelColumn(value: THours.ToString("#0.00")){ },
                            new ExcelColumn(value: THourMoney.ToString("#0.00")){ },
                            new ExcelColumn(value: TKSMoney.ToString("#0.00")){ }
                        }
                };
                RDateList.Add(firstRowT);
            }
            return RDateList;
        }

        /// <summary>
        /// 获取学生课时统计明细列表
        /// </summary>
        /// <param name="pageIndex"></param>
        /// <param name="pageSize"></param>
        /// <param name="count"></param>
        /// <param name="teacherId"></param>
        /// <param name="schoolId"></param>
        /// <param name="classId"></param>
        /// <param name="startMonth"></param>
        /// <param name="endMonth"></param>
        /// <param name="studentName"></param>
        /// <param name="orderId"></param>
        /// <param name="contractNo"></param>
        /// <param name="group_Id"></param>
        /// <returns></returns>
        public object GetStudentConsumptionHoursDetialPageList(int pageIndex, int pageSize, out long count, int teacherId, int schoolId, int classId, string startMonth, string endMonth, string studentName, int orderId, string contractNo, int groupId,int StudentId)
        {
            List<object> RList = new List<object>();
            //根据学生签到表  查询
            var list = class_CheckRepository.GetStudentConsumptionHoursDetialPageList(pageIndex, pageSize, out count, teacherId, schoolId, classId, startMonth, endMonth, studentName, orderId, contractNo, groupId, StudentId);
            if (list.Any())
            {
                //查询关联销售
                string userids = string.Join(",", list.Select(x => x.EnterID).Distinct());
                var ulist = accountRepository.GetEmployeeListRepository(new Model.ViewModel.User.Employee_ViewModel() { Group_Id = groupId, QIds = userids });
                //查询关联老师
                string teacherIds = string.Join(",", list.Where(x => x.EnterID != x.HelpEnterId && x.HelpEnterId > 0).Select(x => x.HelpEnterId).Distinct());
                List<Model.ViewModel.User.Employee_ViewModel> teacherList = new List<Model.ViewModel.User.Employee_ViewModel>();
                if (!string.IsNullOrEmpty(teacherIds))
                {
                    teacherList = accountRepository.GetEmployeeListRepository(new Model.ViewModel.User.Employee_ViewModel() { Group_Id = groupId, QIds = teacherIds });
                }
                List<RB_Order_ViewModel> sourceTargetList = new List<RB_Order_ViewModel>();
                List<int> idList = new List<int>();
                var sourceOrderIdList = Common.ConvertHelper.StringToList(string.Join(",", list.Select(x => x.SourceOrderId)));
                if (sourceOrderIdList != null && sourceOrderIdList.Count > 0)
                {
                    idList.AddRange(sourceOrderIdList);
                }
                var targetOrderIdList = Common.ConvertHelper.StringToList(string.Join(",", list.Select(x => x.TargetOrderId)));
                if (targetOrderIdList != null && targetOrderIdList.Count > 0)
                {
                    idList.AddRange(targetOrderIdList);
                }
                if (idList != null && idList.Count > 0)
                {
                    string ids = string.Join(",", idList);
                    sourceTargetList = orderRepository.GetOrderListRepository(new RB_Order_ViewModel { QOrderIds = ids });
                }

                foreach (var item in list)
                {
                    if (item.SourceOrderId > 0)
                    {
                        item.SourceClassName = sourceTargetList?.Where(qitem => qitem.OrderId == item.SourceOrderId)?.FirstOrDefault()?.ClassName;
                    }
                    if (item.TargetOrderId > 0)
                    {
                        item.TargetClassName = sourceTargetList?.Where(qitem => qitem.OrderId == item.TargetOrderId)?.FirstOrDefault()?.ClassName;
                    }
                    string SaleName = ulist.Where(x => x.Id == item.EnterID).FirstOrDefault()?.EmployeeName ?? "";
                    string HelpEnterName = "";
                    if (item.EnterID != item.HelpEnterId && item.HelpEnterId > 0) {
                        HelpEnterName = teacherList.Where(x => x.Id == item.HelpEnterId).FirstOrDefault()?.EmployeeName ?? "";
                    }
                    decimal UnitPrice = Math.Round(item.UnitPrice, 6, MidpointRounding.AwayFromZero);
                    RList.Add(new
                    {
                        ClassDate = item.ClassDate.ToString("yyyy-MM-dd"),
                        TimeBucket = item.StartDate + "~" + item.EndDate,
                        item.OrderGuestId,
                        item.GuestName,
                        item.TeacherId,
                        item.TeacherName,
                        item.ClassId,
                        item.ClassName,
                        item.ClassNo,
                        item.CouseId,
                        item.CourseName,
                        item.OrderId,
                        item.ContractNo,
                        item.CurrentDeductionHours,
                        UnitPrice,
                        XHMoney = Math.Round(item.UnitPrice * item.CurrentDeductionHours, 6, MidpointRounding.AwayFromZero),
                        SaleName,
                        HelpEnterName,
                        item.JoinType,
                        item.TargetJoinType,
                        item.SourceOrderId,
                        item.TargetOrderId,
                        item.SourceClassName,
                        item.TargetClassName,
                    });
                }
            }
            return RList;
        }

        /// <summary>
        /// 导出Excel
        /// </summary>
        /// <param name="teacherId"></param>
        /// <param name="schoolId"></param>
        /// <param name="classId"></param>
        /// <param name="startMonth"></param>
        /// <param name="endMonth"></param>
        /// <param name="studentName"></param>
        /// <param name="orderId"></param>
        /// <param name="contractNo"></param>
        /// <param name="groupId"></param>
        /// <returns></returns>
        public List<ExcelDataSource> GetStudentConsumptionHoursDetialPageListToExcel(int teacherId, int schoolId, int classId, string startMonth, string endMonth, string studentName, int orderId, string contractNo, int groupId)
        {
            List<ExcelDataSource> RList = new List<ExcelDataSource>();
            //根据学生签到表  查询
            var list = class_CheckRepository.GetStudentConsumptionHoursDetialList(teacherId, schoolId, classId, startMonth, endMonth, studentName, orderId, contractNo, groupId);
            if (list.Any())
            {
                //查询关联销售
                string userids = string.Join(",", list.Select(x => x.EnterID).Distinct());
                var ulist = accountRepository.GetEmployeeListRepository(new Model.ViewModel.User.Employee_ViewModel() { Group_Id = groupId, QIds = userids });
                //查询关联老师
                string teacherIds = string.Join(",", list.Where(x => x.EnterID != x.HelpEnterId && x.HelpEnterId > 0).Select(x => x.HelpEnterId).Distinct());
                List<Model.ViewModel.User.Employee_ViewModel> teacherList = new List<Model.ViewModel.User.Employee_ViewModel>();
                if (!string.IsNullOrEmpty(teacherIds))
                {
                    teacherList = accountRepository.GetEmployeeListRepository(new Model.ViewModel.User.Employee_ViewModel() { Group_Id = groupId, QIds = teacherIds });
                }
                decimal TcdHours = 0, TPrice = 0;
                foreach (var item in list)
                {
                    string SaleName = ulist.Where(x => x.Id == item.EnterID).FirstOrDefault()?.EmployeeName ?? "";
                    string HelpEnterName = "";
                    if (item.EnterID != item.HelpEnterId && item.HelpEnterId > 0)
                    {
                        HelpEnterName = teacherList.Where(x => x.Id == item.HelpEnterId).FirstOrDefault()?.EmployeeName ?? "";
                    }
                    decimal UnitPrice = Math.Round(item.UnitPrice, 6, MidpointRounding.AwayFromZero);

                    ExcelDataSource firstRow = new ExcelDataSource(30)
                    {
                        ExcelRows = new List<ExcelColumn>()
                        {
                            new ExcelColumn(value: item.OrderId.ToString()){ },
                            new ExcelColumn(value: item.ContractNo){ },
                            new ExcelColumn(value: item.ClassDate.ToString("yyyy-MM-dd")){ },
                            new ExcelColumn(value: item.StartDate + "~" + item.EndDate){ },
                            new ExcelColumn(value: item.GuestName){ },
                            new ExcelColumn(value: item.ClassNo){ },
                            new ExcelColumn(value: item.ClassName){ },
                            new ExcelColumn(value: item.CourseName){ },
                            new ExcelColumn(value: item.TeacherName){ },
                            new ExcelColumn(value: item.CurrentDeductionHours.ToString("#0.00")){ },
                            new ExcelColumn(value: UnitPrice.ToString("#0.000000")){ },
                            new ExcelColumn(value: Math.Round(item.UnitPrice * item.CurrentDeductionHours,6,MidpointRounding.AwayFromZero).ToString("#0.000000")){ },
                            new ExcelColumn(value: SaleName){ },
                            new ExcelColumn(value: HelpEnterName){ }
                        }
                    };
                    RList.Add(firstRow);
                    TcdHours += item.CurrentDeductionHours;
                    TPrice += Math.Round(item.UnitPrice * item.CurrentDeductionHours, 6, MidpointRounding.AwayFromZero);
                }

                ExcelDataSource firstRowT = new ExcelDataSource(30)
                {
                    ExcelRows = new List<ExcelColumn>()
                        {
                            new ExcelColumn(value: "合计"){ },
                            new ExcelColumn(value: ""){ },
                            new ExcelColumn(value: ""){ },
                            new ExcelColumn(value: ""){ },
                            new ExcelColumn(value: ""){ },
                            new ExcelColumn(value: ""){ },
                            new ExcelColumn(value: ""){ },
                            new ExcelColumn(value: ""){ },
                            new ExcelColumn(value: ""){ },
                            new ExcelColumn(value: TcdHours.ToString("#0.00")){ },
                            new ExcelColumn(value: ""){ },
                            new ExcelColumn(value: TPrice.ToString("#0.00")){ },
                            new ExcelColumn(value: ""){ },
                            new ExcelColumn(value: ""){ }
                        }
                };
                RList.Add(firstRowT);
            }
            return RList;
        }

        /// <summary>
        /// 获取销售业绩排名统计
        /// </summary>
        /// <param name="pageIndex"></param>
        /// <param name="pageSize"></param>
        /// <param name="count"></param>
        /// <param name="saleId"></param>
        /// <param name="schoolId"></param>
        /// <param name="startMonth"></param>
        /// <param name="endMonth"></param>
        /// <param name="group_Id"></param>
        /// <returns></returns>
        public List<RB_Order_ViewModel> GetSaleAchievementsRankStatistics(int pageIndex, int pageSize, out long count, int saleId, int schoolId, string startMonth, string endMonth, int group_Id)
        {
            var list = orderRepository.GetSaleAchievementsRankStatistics(pageIndex, pageSize, out count, saleId, schoolId, startMonth, endMonth, group_Id);
            if (list.Any()) {
                string userIds = string.Join(",", list.Select(x => x.EnterID).Distinct());
                var ulist = accountRepository.GetEmployeeListRepository(new Model.ViewModel.User.Employee_ViewModel() { Group_Id = group_Id, QIds = userIds });
                foreach (var item in list) {
                    item.EnterName = ulist.Where(x => x.Id == item.EnterID).FirstOrDefault()?.EmployeeName ?? "";
                }
            }
            return list;
        }

        /// <summary>
        /// 获取销售业绩排名 (单据版)
        /// </summary>
        /// <param name="startMonth"></param>
        /// <param name="endMonth"></param>
        /// <param name="group_Id"></param>
        /// <returns></returns>
        public List<RB_Order_ViewModel> GetSaleAchievementsRankStatistics_V2(string startMonth, string endMonth, int group_Id)
        {
            List<RB_Order_ViewModel> RList = new List<RB_Order_ViewModel>();
            List<int> empIdList = new List<int>();//业务员列表
            //首先获取当月新增订单
            var olist = orderRepository.GetNewOrderStatistics(startMonth, endMonth, group_Id);//业务员  应收  报名人数  订单数量
            if (olist.Any()) {
                empIdList.AddRange(olist.Select(x => x.EnterID));
            }
            //查询当月已上课金额
            var ylist = orderRepository.GetOrderClassHoursMoneyList(startMonth, endMonth, group_Id);//业务员  已上课金额
            if (ylist.Any())
            {
                empIdList.AddRange(ylist.Select(x => x.EnterID));
            }
            //查询当月结课人数
            var jlist = orderRepository.GetOrderGuestEndClassList(startMonth, endMonth, group_Id);//业务员  结课数量
            if (jlist.Any())
            {
                empIdList.AddRange(jlist.Select(x => x.EnterID));
            }

            #region 财务单据收入
            //直接查询关联订单的单据
            var flist = RB_FinanceRepository.GetListForReport(new RB_Finance_Extend() { RB_Group_Id = group_Id, IsSelectOrder = 1, FinanceType = 2, sAduitDate = Convert.ToDateTime(startMonth), eAduitDate = Convert.ToDateTime(endMonth) });
            if (flist.Any()) {
                empIdList.AddRange(flist.Select(x => x.CreateBy ?? 0));
            }
            #endregion

            //查询人员
            empIdList = empIdList.Where(x => x > 0).Distinct().ToList();
            if (empIdList.Any()) {
                string userIds = string.Join(",", empIdList);
                var ulist = accountRepository.GetEmployeeListRepository(new Model.ViewModel.User.Employee_ViewModel() { Group_Id = group_Id, QIds = userIds });
                foreach (var umodel in ulist) {
                    var omodel = olist.Where(x => x.EnterID == umodel.Id).FirstOrDefault();
                    var ymodel = ylist.Where(x => x.EnterID == umodel.Id).FirstOrDefault();
                    var jmodel = jlist.Where(x => x.EnterID == umodel.Id).FirstOrDefault();

                    var fclist = flist.Where(x => x.CreateBy == umodel.Id).ToList();
                    decimal Income = fclist.Where(x => x.Type == WFTempLateClassEnum.IN).Sum(x => x.Money ?? 0);
                    decimal PlatformTax = fclist.Where(x => x.Type == WFTempLateClassEnum.IN).GroupBy(x => new { x.FrID, x.Fee }).Sum(x => x.Key.Fee ?? 0);
                    decimal Refund = fclist.Where(x => x.Type == WFTempLateClassEnum.OUT).Sum(x => x.Money ?? 0);

                    RList.Add(new RB_Order_ViewModel()
                    {
                        EnterID = umodel.Id,
                        EnterName = umodel.EmployeeName,
                        DeptName = umodel.DeptName,
                        SchoolName = umodel.SchoolName,
                        PreferPrice = omodel?.PreferPrice ?? 0,
                        Income = Income,
                        PlatformTax = PlatformTax,
                        Refund = Refund,
                        YSKMoney = ymodel?.YSKMoney ?? 0,
                        GuestNum = omodel?.GuestNum ?? 0,
                        JKNum = jmodel?.JKNum ?? 0,
                        CancelNum = omodel?.CancelNum ?? 0
                    });
                }
            }

            RList = RList.OrderByDescending(x => x.Income).ThenBy(x => x.PreferPrice).ToList();
            return RList;
        }

        /// <summary>
        /// 获取Excel导出
        /// </summary>
        /// <param name="saleId"></param>
        /// <param name="schoolId"></param>
        /// <param name="startMonth"></param>
        /// <param name="endMonth"></param>
        /// <param name="group_Id"></param>
        /// <returns></returns>
        public List<RB_Order_ViewModel> GetSaleAchievementsRankStatisticsToExcel(int saleId, int schoolId, string startMonth, string endMonth, int group_Id)
        {
            var list = orderRepository.GetSaleAchievementsRankStatisticsToList(saleId, schoolId, startMonth, endMonth, group_Id);
            if (list.Any())
            {
                string userIds = string.Join(",", list.Select(x => x.EnterID).Distinct());
                var ulist = accountRepository.GetEmployeeListRepository(new Model.ViewModel.User.Employee_ViewModel() { Group_Id = group_Id, QIds = userIds });
                foreach (var item in list)
                {
                    item.EnterName = ulist.Where(x => x.Id == item.EnterID).FirstOrDefault()?.EmployeeName ?? "";
                }
            }
            return list;
        }
        #endregion

        #region 班级相关统计

        /// <summary>
        /// 班级月度课耗统计
        /// </summary>
        /// <param name="classId"></param>
        /// <param name="userInfo"></param>
        /// <returns></returns>
        public object GetClassMonthStatistics(int classId, UserInfo userInfo)
        {
            var classModel = classRepository.GetEntity(classId);
            if (classModel == null) { return ""; }
            string StartTime = classModel.OpenTime.ToString("yyyy-MM-dd");
            string EndTime = DateTime.Now.ToString("yyyy-MM-dd");
            #region 班级下老师的课时费
            List<RB_Teaching_BonusDetail_ViewModel> TeacherHoursList = new List<RB_Teaching_BonusDetail_ViewModel>();
            var TeacherAlist = class_CheckRepository.GetTeacherConsumptionHoursDetialList("", -1, classId, StartTime, EndTime, userInfo.Group_Id);
            if (TeacherAlist.Any())
            {
                //上这班的老师
                string teacherIds = string.Join(",", TeacherAlist.Select(x => x.TeacherId).Distinct());
                //根据学生签到表  查询
                var list = class_CheckRepository.GetTeacherConsumptionHoursDetialList(teacherIds, -1, 0, StartTime, EndTime, userInfo.Group_Id);
                if (list.Any())
                {
                    //班级类型查询
                    var cTypeList = class_TypeRepository.GetClassTypeListRepository(new RB_Class_Type_ViewModel() { Group_Id = userInfo.Group_Id });
                    //基础配置
                    var configModel = class_ConfigRepository.GetClassConfigRepository(new RB_Class_Config_ViewModel() { Group_Id = userInfo.Group_Id });
                    if (configModel == null || configModel.BasicHourFee <= 0 || configModel.BasicMinutes <= 0) { return TeacherHoursList; }

                    foreach (var item in list)
                    {
                        //上课课时
                        decimal KSNum = item.CurrentDeductionHours;//签到课时长度
                        if (item.ClassId == 18) { KSNum = 0; }// 18班 特殊处理

                        decimal ClassHourMinute = configModel.BasicMinutes;//课时分钟数
                                                                           //if (item.ClassHourMinute > 0) { ClassHourMinute = item.ClassHourMinute; }
                        decimal Hours = Math.Round(KSNum * ClassHourMinute / 60, 2, MidpointRounding.AwayFromZero);//小时

                        var typeModel = cTypeList.Where(x => x.CTypeId == item.ClassType).FirstOrDefault();

                        decimal unitPrice = configModel.BasicHourFee + (typeModel?.AddHourFee ?? 0) + (item?.BaseHourFee ?? 0);
                        //课时费  需要每个班级  单独计算  因为 班级有附加费用
                        decimal KSMoney = KSNum * unitPrice;

                        decimal HourMoney = Math.Round(unitPrice / ClassHourMinute * 60, 2, MidpointRounding.AwayFromZero);//每小时课时费


                        TeacherHoursList.Add(new RB_Teaching_BonusDetail_ViewModel
                        {
                            Date = item.ClassDate,
                            TimeBucket = item.StartDate + "~" + item.EndDate,
                            TeacherId = item.TeacherId,
                            TeacherName = item.TeacherName,
                            ClassId = item.ClassId,
                            ClassName = item.ClassName,
                            ClassNo = item.ClassNo,
                            CouseId = item.CouseId,
                            CourseName = item.CourseName,
                            KSNum = KSNum,
                            Hours = Hours,
                            HourMoney = HourMoney,
                            UnitPrice = unitPrice,
                            Money = KSMoney,
                            BaseHoursEnabled = item.BaseHoursEnabled,
                            EnableTime = item.EnableTime
                        });
                    }

                    //初始化 基础课时
                    DateTime STime = Convert.ToDateTime(Convert.ToDateTime(StartTime).ToString("yyyy-MM") + "-01");
                    while (true)
                    {
                        DateTime ETime = STime.AddMonths(1).AddDays(-1);
                        var mlist = TeacherHoursList.Where(x => x.Date >= STime && x.Date <= ETime && x.BaseHoursEnabled == 1 && STime >= Convert.ToDateTime(x.EnableTime)).ToList();
                        #region 基础课时处理
                        decimal DeductionMoney = 0;
                        if (configModel.BasicHours > 0 && mlist.Any())
                        {
                            //遍历所有老师
                            List<int> TeacherIdList = mlist.Select(x => x.TeacherId).Distinct().ToList();
                            foreach (var item in TeacherIdList)
                            {
                                var qblist = mlist.Where(x => x.TeacherId == item).OrderBy(x => x.Date).ThenBy(x => x.UnitPrice).ToList();
                                decimal BasicHours = (decimal)(configModel.BasicHours + (mlist.FirstOrDefault()?.BaseHoursAdd ?? 0));
                                foreach (var qitem in qblist)
                                {
                                    decimal CourseHour = 0, DeductionHour = 0;
                                    if (BasicHours > qitem.KSNum)
                                    {
                                        DeductionHour = qitem.KSNum;
                                        BasicHours -= qitem.KSNum;
                                        DeductionMoney += qitem.KSNum * qitem.UnitPrice;
                                    }
                                    else
                                    {
                                        DeductionHour = BasicHours;
                                        CourseHour = qitem.KSNum - BasicHours;
                                        DeductionMoney += BasicHours * qitem.UnitPrice;
                                        BasicHours = 0;
                                    }
                                    qitem.KSNum = CourseHour;
                                    qitem.DKNum = DeductionHour;
                                    qitem.Money = CourseHour * qitem.UnitPrice;
                                    if (BasicHours <= 0)
                                    {
                                        break;
                                    }
                                }
                            }
                        }
                        #endregion

                        if (STime.ToString("yyyy-MM") == Convert.ToDateTime(EndTime).ToString("yyyy-MM"))
                        {
                            break;
                        }
                        STime = STime.AddMonths(1);
                    }
                }
                TeacherHoursList = TeacherHoursList.Where(x => x.ClassId == classId).ToList();
            }
            
            #endregion
            #region 班级下学生的课耗
            List<RB_Teaching_BonusDetail_ViewModel> StudentHoursList = new List<RB_Teaching_BonusDetail_ViewModel>();
            
            //根据学生签到表  查询
            var stulist = class_CheckRepository.GetStudentConsumptionHoursDetialList(0, -1, classId, StartTime, EndTime, "", 0, "", userInfo.Group_Id);
            if (stulist.Any())
            {
                foreach (var item in stulist)
                {
                    decimal UnitPrice = Math.Round(item.UnitPrice, 6, MidpointRounding.AwayFromZero);
                    StudentHoursList.Add(new RB_Teaching_BonusDetail_ViewModel
                    {
                        Date = item.ClassDate,
                        TimeBucket = item.StartDate + "~" + item.EndDate,
                        TeacherId = item.OrderGuestId,
                        TeacherName = item.GuestName,
                        ClassId = item.ClassId,
                        ClassName = item.ClassName,
                        ClassNo = item.ClassNo,
                        CouseId = item.CouseId,
                        CourseName = item.CourseName,
                        KSNum = item.CurrentDeductionHours,
                        Hours = 0,
                        HourMoney = 0,
                        UnitPrice = UnitPrice,
                        Money = Math.Round(item.UnitPrice * item.CurrentDeductionHours, 6, MidpointRounding.AwayFromZero)
                    });
                }
            }

            #endregion

            List<object> RList = new List<object>();
            if (TeacherHoursList.Any())
            {
                #region 进行月份汇总
                string MaxTime = TeacherHoursList.Max(x => x.Date).ToString("yyyy-MM");

                //初始化 基础课时
                DateTime STime = Convert.ToDateTime(Convert.ToDateTime(StartTime).ToString("yyyy-MM") + "-01");
                while (true)
                {
                    DateTime ETime = STime.AddMonths(1).AddDays(-1);

                    var teacherlist = TeacherHoursList.Where(x => x.Date >= STime && x.Date <= ETime).ToList();
                    var teacherIdList = teacherlist.Select(x => x.TeacherId).Distinct();
                    List<object> tRList = new List<object>();
                    foreach (var qitem in teacherIdList) {
                        var tlist = teacherlist.Where(x => x.TeacherId == qitem).ToList();
                        tRList.Add(new
                        {
                            TeacherId = qitem,
                            TeacherName = tlist.FirstOrDefault()?.TeacherName ?? "",
                            HoursNum = tlist.Sum(x => x.KSNum),
                            BaseHoursNum = tlist.Sum(x=>x.DKNum),
                            HoursMoney = tlist.Sum(x => x.Money)
                        });
                    }

                    var studlist = StudentHoursList.Where(x => x.Date >= STime && x.Date <= ETime).ToList();
                    var studIdList = studlist.Select(x => x.TeacherId).Distinct();
                    int StuNum = studIdList.Count();
                    decimal StuSumHours = studlist.Sum(x => x.KSNum);
                    decimal StuSumMoney = studlist.Sum(x => x.Money);
                    List<object> sRList = new List<object>();
                    foreach (var qitem in studIdList) {
                        var slist = studlist.Where(x => x.TeacherId == qitem).ToList();
                        sRList.Add(new
                        {
                            StudentId = qitem,
                            StudentName = slist.FirstOrDefault()?.TeacherName ?? "",
                            HoursNum = slist.Sum(x => x.KSNum),
                            HoursMoney = slist.Sum(x => x.Money)
                        });
                    }

                    RList.Add(new
                    {
                        Month = STime.ToString("yyyy-MM"),
                        TeacherList = tRList,
                        StuNum,
                        StuSumHours,
                        StuSumMoney,
                        StudentList = sRList
                    });

                    if (STime.ToString("yyyy-MM") == MaxTime)
                    {
                        break;
                    }
                    STime = STime.AddMonths(1);
                }
                #endregion
            }

            return RList;
        }

        /// <summary>
        /// 获取班级月度分摊统计
        /// </summary>
        /// <param name="startTime"></param>
        /// <param name="endTime"></param>
        /// <param name="userInfo"></param>
        /// <returns></returns>
        public object GetAllClassNowMonthStatistics(string startTime, string endTime, int classId, string classNo, int schoolId, UserInfo userInfo)
        {
            List<object> RList = new List<object>();
            List<int> ClassIdArr = new List<int>();
            //首先根据签到表  查询出所有的班级  并分页
            var list = class_CheckRepository.GetAllClassNowMonthStatistics(startTime, endTime, classId, classNo, schoolId, userInfo.Group_Id);
            if (list.Any()) {
                ClassIdArr.AddRange(list.Select(x => x.ClassId));
            }
            //查询时间范围内  除订单外 班级下其他订单 的其他收入  + 其他成本支出
            string datebaseStr = Config.ReadConfigKey("EduDateBase");//教育数据库
            var financeList = RB_FinanceRepository.GetListForReportClass(new RB_Finance_Extend() { RB_Group_Id = userInfo.Group_Id, RB_Branch_Id = schoolId, TCID = -2, sAduitDate = Convert.ToDateTime(startTime), eAduitDate = Convert.ToDateTime(endTime), FinanceType = 2, OrderSource = OrderResourceEnum.Education }, datebaseStr);
            if (financeList.Any()) {
                ClassIdArr.AddRange(financeList.Select(x => x.TCID ?? 0));
            }
            string STime = Convert.ToDateTime(startTime).AddMonths(-1).ToString("yyyy-MM-dd");
            string ETime = Convert.ToDateTime(endTime).AddMonths(-1).ToString("yyyy-MM-dd");
            var teacherBonusList = teaching_BonusDetailRepository.GetTeacherBonusForDate(userInfo.Group_Id, schoolId, "", STime, ETime);//查询所有班级需要发放
            if (teacherBonusList.Any()) {
                ClassIdArr.AddRange(teacherBonusList.Select(x => x.ClassId));
            }
            var meritsProfitList = teaching_PerfRepository.GetTeacherPerfForDate(userInfo.Group_Id, schoolId, "", startTime, endTime);
            if (meritsProfitList.Any()) {
                ClassIdArr.AddRange(meritsProfitList.Select(x => x.ClassId));
            }
            var saleList = sell_Commission_DetailsRepository.GetSellCommissionForDate(userInfo.Group_Id, schoolId, "", STime, ETime);
            if (saleList.Any()) {
                ClassIdArr.AddRange(saleList.Select(x => x.ClassId));
            }

            ClassIdArr = ClassIdArr.Distinct().ToList();
            List<RB_Class_ViewModel> CAlllist = new List<RB_Class_ViewModel>();
            if (ClassIdArr.Any())
            {
                //再次查询所有的班级
                CAlllist = classRepository.GetClassListRepository(new RB_Class_ViewModel() { Group_Id = userInfo.Group_Id, Q_ClassIds = string.Join(",", ClassIdArr) });
            }

            if (CAlllist.Any())
            {
                string classIds = string.Join(",", CAlllist.Select(x => x.ClassId));
                //查询时间范围内  所有班级的学生上课金额
                List<RB_Teaching_BonusDetail_ViewModel> StudentHoursList = new List<RB_Teaching_BonusDetail_ViewModel>();
                //根据学生签到表  查询
                var stulist = class_CheckRepository.GetStudentConsumptionHoursDetialList(0, -1, 0, startTime, endTime, "", 0, "", userInfo.Group_Id, classIds);
                if (stulist.Any())
                {
                    foreach (var item in stulist)
                    {
                        decimal UnitPrice = Math.Round(item.UnitPrice, 6, MidpointRounding.AwayFromZero);
                        StudentHoursList.Add(new RB_Teaching_BonusDetail_ViewModel
                        {
                            Date = item.ClassDate,
                            TimeBucket = item.StartDate + "~" + item.EndDate,
                            TeacherId = item.OrderGuestId,
                            TeacherName = item.GuestName,
                            ClassId = item.ClassId,
                            ClassName = item.ClassName,
                            ClassNo = item.ClassNo,
                            CouseId = item.CouseId,
                            CourseName = item.CourseName,
                            KSNum = item.CurrentDeductionHours,
                            Hours = 0,
                            HourMoney = 0,
                            UnitPrice = UnitPrice,
                            Money = Math.Round(item.UnitPrice * item.CurrentDeductionHours, 6, MidpointRounding.AwayFromZero)
                        });
                    }
                }
                //查询时间范围内  所有班级的销售提成 , 老师课时费 , 老师绩效
                //var teacherBonusList = teaching_BonusDetailRepository.GetTeacherBonusForDate(userInfo.Group_Id, classIds, STime, ETime);
                //var meritsProfitList = teaching_PerfRepository.GetTeacherPerfForDate(userInfo.Group_Id, classIds, startTime, endTime);
                //var saleList = sell_Commission_DetailsRepository.GetSellCommissionForDate(userInfo.Group_Id, classIds, STime, ETime);

                foreach (var item in CAlllist) {
                    #region 学生课耗
                    var slist = StudentHoursList.Where(x => x.ClassId == item.ClassId).ToList();
                    decimal TStuMoney = slist.Sum(x => x.Money);//上课总金额
                    int TStuNum = slist.Select(x => x.TeacherId).Distinct().Count();//上课学生数量
                    var StuList = slist.GroupBy(x => new { x.TeacherId, x.TeacherName }).Select(g => new
                    {
                        StuId = g.Key.TeacherId,
                        StuName = g.Key.TeacherName,
                        KSNum = g.Sum(t => t.KSNum),
                        Money = g.Sum(t => t.Money)
                    });
                    #endregion
                    #region 提成
                    decimal BonusMoney = teacherBonusList.Where(x => x.ClassId == item.ClassId).FirstOrDefault()?.Money ?? 0;//老师课时费
                    decimal PerfMoney = meritsProfitList.Where(x => x.ClassId == item.ClassId).FirstOrDefault()?.Money ?? 0;//老师绩效
                    decimal SellMoney = saleList.Where(x => x.ClassId == item.ClassId).FirstOrDefault()?.CurrentPeriodMoney ?? 0;//销售提成
                    #endregion
                    #region 单据
                    var flist = financeList.Where(x => x.TCID == item.ClassId).ToList();
                    decimal OtherIncome = flist.Where(y => y.Type == WFTempLateClassEnum.IN && y.Is_Cashier == 1 && y.OrderID <= 0).Sum(x => x.Money ?? 0);
                    decimal Fee = flist.Where(x => x.Type == WFTempLateClassEnum.IN && x.Is_Cashier == 1 && x.OrderID <= 0 && x.Fee > 0).GroupBy(x => new { x.FrID, x.Fee }).Sum(x => x.Key.Fee ?? 0);
                    OtherIncome -= Fee;
                    decimal OtherCost = flist.Where(y => y.Type == WFTempLateClassEnum.OUT && y.OrderID <= 0).Sum(x => x.Money ?? 0);//支出也要排除订单订单退款
                    #endregion

                    decimal THoursNum = list.Where(x => x.ClassId == item.ClassId).FirstOrDefault()?.CurrentDeductionHours ?? 0;

                    object RModel = new
                    {
                        item.ClassId,
                        item.ClassNo,
                        OrderIds = "",
                        item.ClassName,
                        ClassType = 1,
                        THoursNum,
                        TStuNum,
                        TStuMoney,
                        StuList,
                        BonusMoney,
                        PerfMoney,
                        SellMoney,
                        OtherIncome,
                        OtherCost
                    };
                    RList.Add(RModel);
                }
            }


            //查询留学的
            List<int> SourceIdArr = new List<int>();
            var lxOrderList = orderRepository.GetListForReport(new RB_Order_ViewModel() { Group_Id = userInfo.Group_Id, School_Id = schoolId, OrderType = Common.Enum.Sale.OrderTypeEnum.StudyabroadOrder, Q_OrderState = 1, ConfirmSTime = startTime, ConfirmETime = endTime });
            if (lxOrderList.Any()) {
                SourceIdArr.AddRange(lxOrderList.Select(x => x.SourceId).Distinct());
            }
            //财务单据
            var lxFinanceList = RB_FinanceRepository.GetListForReportClass(new RB_Finance_Extend() { RB_Group_Id = userInfo.Group_Id, RB_Branch_Id = schoolId, TCID = -2, sAduitDate = Convert.ToDateTime(startTime), eAduitDate = Convert.ToDateTime(endTime), FinanceType = 2, OrderSource = OrderResourceEnum.EducationStudy }, datebaseStr);
            if (lxFinanceList.Any())
            {
                SourceIdArr.AddRange(lxFinanceList.Select(x => x.TCID ?? 0));
            }
            List<RB_Order_Guest_ViewModel> lxGuestList = new List<RB_Order_Guest_ViewModel>();
            List<Model.ViewModel.StudyAbroad.RB_StudyAbroad_ViewModel> saList = new List<Model.ViewModel.StudyAbroad.RB_StudyAbroad_ViewModel>();
            if (SourceIdArr.Any())
            {
                if (lxOrderList.Any())
                {
                    string orderIds = string.Join(",", lxOrderList.Select(x => x.OrderId));
                    //查询学生
                    lxGuestList = order_GuestRepository.GetOrderGuestListRepository(new RB_Order_Guest_ViewModel() { Group_Id = userInfo.Group_Id, OrderIds = orderIds });
                }

                string saIds = string.Join(",", SourceIdArr.Distinct());
                //查询留学产品
                saList = studyAbroadRepository.GetStudyAbroadListExtRepository(new Model.ViewModel.StudyAbroad.RB_StudyAbroad_ViewModel() { Group_Id = userInfo.Group_Id, QIds = saIds });
            }

            foreach (var item in saList) {
                #region 订单
                var olist = lxOrderList.Where(x => x.SourceId == item.Id).ToList();
                decimal ShiShou = olist.Sum(item => item.Income - item.Refund + item.PlatformTax);
                int GuestNum = olist.Sum(item => item.GuestNum);
                var glist = lxGuestList.Where(x => olist.Select(x => x.OrderId).Contains(x.OrderId)).Select(x => new
                {
                    StuId = x.Id,
                    StuName = x.GuestName
                });
                #endregion
                #region 财务单据
                var lxflist = lxFinanceList.Where(x => x.TCID == item.Id).ToList();
                //排序订单单据
                var cfinanceList = lxflist.Where(x => x.OrderID == 0 && x.Type == WFTempLateClassEnum.IN).ToList();
                decimal QTShouRu = cfinanceList.Where(y => y.Is_Cashier == 1).Sum(x => x.Money ?? 0);
                QTShouRu -= cfinanceList.Where(x => x.Is_Cashier == 1 && x.Fee > 0).GroupBy(x => new { x.FrID, x.Fee }).Sum(x => x.Key.Fee ?? 0);
                //支出
                decimal TiCheng = 0;//销售提成   -留学提成暂定
                decimal ClassFee = 0;//老师提成   -留学暂定
                decimal JiXiaoMoney = 0;//绩效提成   -留学暂定

                var ofinanceList = lxflist.Where(x => x.OrderID == 0 && x.Type == WFTempLateClassEnum.OUT).ToList();
                decimal QTZhiChu = ofinanceList.Sum(x => x.Money ?? 0);

                #endregion

                object RModel = new
                {
                    ClassId = item.Id,
                    ClassNo = "",
                    OrderIds = string.Join(",", olist.Select(x => x.OrderId)),
                    ClassName = item.Name,
                    ClassType = 2,
                    THoursNum = 0,
                    TStuNum = GuestNum,
                    TStuMoney = ShiShou,
                    StuList = glist,
                    BonusMoney = ClassFee,
                    PerfMoney = JiXiaoMoney,
                    SellMoney = TiCheng,
                    OtherIncome = QTShouRu,
                    OtherCost = QTZhiChu
                };
                RList.Add(RModel);
            }

            return RList;
        }

        #endregion


        #region 老师-月度耗课
        /// <summary>
        /// 班级月度课耗统计
        /// </summary>
        /// <param name="classId"></param>
        /// <param name="userInfo"></param>
        /// <returns></returns>
        public object GetTeacherClassMonthStatistics(int classId, UserInfo userInfo)
        {
            var classModel = classRepository.GetEntity(classId);
            if (classModel == null) { return ""; }
            string StartTime = classModel.OpenTime.ToString("yyyy-MM-dd");
            string EndTime = DateTime.Now.ToString("yyyy-MM-dd");
            #region 班级下老师的课时费
            List<RB_Teaching_BonusDetail_ViewModel> TeacherHoursList = new List<RB_Teaching_BonusDetail_ViewModel>();

            //根据学生签到表  查询
            var list = class_CheckRepository.GetTeacherConsumptionHoursDetialList(userInfo.AccountId.ToString(), -1, classId, StartTime, EndTime, userInfo.Group_Id);
            if (list.Any())
            {
                //班级类型查询
                var cTypeList = class_TypeRepository.GetClassTypeListRepository(new RB_Class_Type_ViewModel() { Group_Id = userInfo.Group_Id });
                //基础配置
                var configModel = class_ConfigRepository.GetClassConfigRepository(new RB_Class_Config_ViewModel() { Group_Id = userInfo.Group_Id });
                if (configModel == null || configModel.BasicHourFee <= 0 || configModel.BasicMinutes <= 0) { return TeacherHoursList; }

                foreach (var item in list)
                {
                    int Minutes = (int)(Convert.ToDateTime("2021-06-29 " + item.EndDate) - Convert.ToDateTime("2021-06-29 " + item.StartDate)).TotalMinutes;
                    decimal Hours = Math.Round(Convert.ToDecimal(Minutes) / 60, 2, MidpointRounding.AwayFromZero);//小时
                    //上课课时
                    decimal KSNum = item.CurrentDeductionHours;//签到课时长度

                    var typeModel = cTypeList.Where(x => x.CTypeId == item.ClassType).FirstOrDefault();

                    decimal unitPrice = configModel.BasicHourFee + (typeModel?.AddHourFee ?? 0) + (item?.BaseHourFee ?? 0);
                    //课时费  需要每个班级  单独计算  因为 班级有附加费用
                    decimal KSMoney = KSNum * unitPrice;

                    decimal ClassHourMinute = configModel.BasicMinutes;//课时分钟数
                    if (item.ClassHourMinute > 0) { ClassHourMinute = item.ClassHourMinute; }
                    decimal HourMoney = Math.Round(unitPrice / ClassHourMinute * 60, 2, MidpointRounding.AwayFromZero);//每小时课时费


                    TeacherHoursList.Add(new RB_Teaching_BonusDetail_ViewModel
                    {
                        Date = item.ClassDate,
                        TimeBucket = item.StartDate + "~" + item.EndDate,
                        TeacherId = item.TeacherId,
                        TeacherName = item.TeacherName,
                        ClassId = item.ClassId,
                        ClassName = item.ClassName,
                        ClassNo = item.ClassNo,
                        CouseId = item.CouseId,
                        CourseName = item.CourseName,
                        KSNum = KSNum,
                        Hours = Hours,
                        HourMoney = HourMoney,
                        UnitPrice = unitPrice,
                        Money = KSMoney,
                        BaseHoursEnabled = item.BaseHoursEnabled,
                        EnableTime = item.EnableTime
                    });
                }

                //初始化 基础课时
                DateTime STime = Convert.ToDateTime(Convert.ToDateTime(StartTime).ToString("yyyy-MM") + "-01");
                while (true)
                {
                    DateTime ETime = STime.AddMonths(1).AddDays(-1);
                    var mlist = TeacherHoursList.Where(x => x.Date >= STime && x.Date <= ETime && x.BaseHoursEnabled == 1 && STime >= Convert.ToDateTime(x.EnableTime)).ToList();
                    #region 基础课时处理
                    decimal DeductionMoney = 0;
                    if (configModel.BasicHours > 0 && mlist.Any())
                    {
                        //遍历所有老师
                        List<int> TeacherIdList = mlist.Select(x => x.TeacherId).Distinct().ToList();
                        foreach (var item in TeacherIdList)
                        {
                            var qblist = mlist.Where(x => x.TeacherId == item).OrderBy(x => x.Date).ThenBy(x => x.UnitPrice).ToList();
                            decimal BasicHours = (decimal)(configModel.BasicHours + (mlist.FirstOrDefault()?.BaseHoursAdd ?? 0));
                            foreach (var qitem in qblist)
                            {
                                decimal CourseHour = 0, DeductionHour = 0;
                                if (BasicHours > qitem.KSNum)
                                {
                                    DeductionHour = qitem.KSNum;
                                    BasicHours -= qitem.KSNum;
                                    DeductionMoney += qitem.KSNum * qitem.UnitPrice;
                                }
                                else
                                {
                                    DeductionHour = BasicHours;
                                    CourseHour = qitem.KSNum - BasicHours;
                                    DeductionMoney += BasicHours * qitem.UnitPrice;
                                    BasicHours = 0;
                                }
                                qitem.KSNum = CourseHour;
                                qitem.DKNum = DeductionHour;
                                qitem.Money = CourseHour * qitem.UnitPrice;
                                if (BasicHours <= 0)
                                {
                                    break;
                                }
                            }
                        }
                    }
                    #endregion

                    if (STime.ToString("yyyy-MM") == Convert.ToDateTime(EndTime).ToString("yyyy-MM"))
                    {
                        break;
                    }
                    STime = STime.AddMonths(1);
                }
            }

            #endregion
            #region 班级下学生的课耗
            List<RB_Teaching_BonusDetail_ViewModel> StudentHoursList = new List<RB_Teaching_BonusDetail_ViewModel>();

            //根据学生签到表  查询
            var stulist = class_CheckRepository.GetStudentConsumptionHoursDetialList(userInfo.AccountId, -1, classId, StartTime, EndTime, "", 0, "", userInfo.Group_Id);
            if (stulist.Any())
            {
                foreach (var item in stulist)
                {
                    decimal UnitPrice = Math.Round(item.UnitPrice, 6, MidpointRounding.AwayFromZero);
                    StudentHoursList.Add(new RB_Teaching_BonusDetail_ViewModel
                    {
                        Date = item.ClassDate,
                        TimeBucket = item.StartDate + "~" + item.EndDate,
                        TeacherId = item.OrderGuestId,
                        TeacherName = item.GuestName,
                        ClassId = item.ClassId,
                        ClassName = item.ClassName,
                        ClassNo = item.ClassNo,
                        CouseId = item.CouseId,
                        CourseName = item.CourseName,
                        KSNum = item.CurrentDeductionHours,
                        Hours = 0,
                        HourMoney = 0,
                        UnitPrice = UnitPrice,
                        Money = Math.Round(item.UnitPrice * item.CurrentDeductionHours, 6, MidpointRounding.AwayFromZero)
                    });
                }
            }

            #endregion

            List<object> RList = new List<object>();
            if (TeacherHoursList.Any())
            {
                #region 进行月份汇总
                string MaxTime = TeacherHoursList.Max(x => x.Date).ToString("yyyy-MM");

                //初始化 基础课时
                DateTime STime = Convert.ToDateTime(Convert.ToDateTime(StartTime).ToString("yyyy-MM") + "-01");
                while (true)
                {
                    DateTime ETime = STime.AddMonths(1).AddDays(-1);

                    var teacherlist = TeacherHoursList.Where(x => x.Date >= STime && x.Date <= ETime).ToList();
                    var teacherIdList = teacherlist.Select(x => x.TeacherId).Distinct();
                    List<object> tRList = new List<object>();
                    foreach (var qitem in teacherIdList)
                    {
                        var tlist = teacherlist.Where(x => x.TeacherId == qitem).ToList();
                        tRList.Add(new
                        {
                            TeacherId = qitem,
                            TeacherName = tlist.FirstOrDefault()?.TeacherName ?? "",
                            HoursNum = tlist.Sum(x => x.KSNum),
                            BaseHoursNum = tlist.Sum(x => x.DKNum),
                            HoursMoney = tlist.Sum(x => x.Money)
                        });
                    }

                    var studlist = StudentHoursList.Where(x => x.Date >= STime && x.Date <= ETime).ToList();
                    var studIdList = studlist.Select(x => x.TeacherId).Distinct();
                    int StuNum = studIdList.Count();
                    decimal StuSumHours = studlist.Sum(x => x.KSNum);
                    decimal StuSumMoney = studlist.Sum(x => x.Money);
                    List<object> sRList = new List<object>();
                    foreach (var qitem in studIdList)
                    {
                        var slist = studlist.Where(x => x.TeacherId == qitem).ToList();
                        sRList.Add(new
                        {
                            StudentId = qitem,
                            StudentName = slist.FirstOrDefault()?.TeacherName ?? "",
                            HoursNum = slist.Sum(x => x.KSNum),
                            HoursMoney = slist.Sum(x => x.Money)
                        });
                    }

                    RList.Add(new
                    {
                        Month = STime.ToString("yyyy-MM"),
                        TeacherList = tRList,
                        StuNum,
                        StuSumHours,
                        StuSumMoney,
                        StudentList = sRList
                    });

                    if (STime.ToString("yyyy-MM") == MaxTime)
                    {
                        break;
                    }
                    STime = STime.AddMonths(1);
                }
                #endregion
            }

            return RList;
        }


        /// <summary>
        /// 获取试听班级月度老师课时费
        /// </summary>
        /// <param name="reserveClassId"></param>
        /// <returns></returns>
        public RB_Teaching_BonusDetail_ViewModel GetReserveClassHours(int reserveClassId,int groupId)
        {
            return teaching_BonusDetailRepository.GetReserveClassHours(reserveClassId, groupId);
        }

        #endregion

        #region 收据管理

        /// <summary>
        /// 获取收据配置
        /// </summary>
        /// <param name="userInfo"></param>
        /// <returns></returns>
        public RB_Receipt_Config_ViewModel GetReceiptConfigInfo(UserInfo userInfo)
        {
            var model = receipt_ConfigRepository.GetList(new RB_Receipt_Config_ViewModel() { Group_Id = userInfo.Group_Id }).FirstOrDefault();
            if (model != null) {
                //查询流程
                var tempList = Finance_TemplateRepository.GetList(new Rb_Workflow_Template_Finance_Extend() { RB_GroupId = userInfo.Group_Id, TemplateIds = model.TempleteIds });
                model.TempleteList = tempList.Select(x => x.Name).ToList();
            }
            return model;
        }

        /// <summary>
        /// 保存收据配置
        /// </summary>
        /// <param name="demodel"></param>
        /// <returns></returns>
        public string SetReceiptConfingInfo(RB_Receipt_Config_ViewModel demodel) {
            if (demodel.Id > 0)
            {
                Dictionary<string, object> keyValues = new Dictionary<string, object>() {
                    { nameof(RB_Receipt_Config_ViewModel.Enable), demodel.Enable},
                    { nameof(RB_Receipt_Config_ViewModel.TempleteIds), demodel.TempleteIds},
                    { nameof(RB_Receipt_Config_ViewModel.Images), demodel.Images},
                    { nameof(RB_Receipt_Config_ViewModel.UpdateBy), demodel.UpdateBy},
                    { nameof(RB_Receipt_Config_ViewModel.UpdateTime), demodel.UpdateTime},
                };
                List<WhereHelper> wheres = new List<WhereHelper>() {
                    new WhereHelper(){
                         FiledName = nameof(RB_Receipt_Config_ViewModel.Id),
                          FiledValue = demodel.Id,
                           OperatorEnum =OperatorEnum.Equal
                    }
                };
                bool flag = receipt_ConfigRepository.Update(keyValues, wheres);
                return flag ? "" : "出错了,请联系管理员";
            }
            else {
                bool flag = receipt_ConfigRepository.Insert(demodel) > 0;
                return flag ? "" : "出错了,请联系管理员";
            }
        }

        /// <summary>
        /// 获取收据分页列表
        /// </summary>
        /// <param name="pageIndex"></param>
        /// <param name="pageSize"></param>
        /// <param name="count"></param>
        /// <param name="demodel"></param>
        /// <returns></returns>
        public List<RB_Receipt_Info_ViewModel> GetReceiptInfoPageList(int pageIndex, int pageSize, out long count, RB_Receipt_Info_ViewModel demodel)
        {
            return receipt_InfoRepository.GetPageList(pageIndex, pageSize, out count, demodel);
        }

        /// <summary>
        /// 根据财务单据ID获取收据信息
        /// </summary>
        /// <param name="financeId"></param>
        /// <param name="userInfo"></param>
        /// <returns></returns>
        public RB_Receipt_Info_ViewModel GetReceiptInfoForFinanceId(int financeId, UserInfo userInfo)
        {
            var model = receipt_InfoRepository.GetList(new RB_Receipt_Info_ViewModel() { Group_Id = userInfo.Group_Id, FinanceId = financeId }).FirstOrDefault();
            if (model != null)
            {
                var cmodel = receipt_ConfigRepository.GetList(new RB_Receipt_Config_ViewModel() { Group_Id = userInfo.Group_Id }).FirstOrDefault();
                if (cmodel != null)
                {
                    model.SealImages = cmodel.Images;
                }
            }
            return model;
        }

        /// <summary>
        /// 新增修改收据信息
        /// </summary>
        /// <param name="demodel"></param>
        /// <returns></returns>
        public string SetReceiptInfo(RB_Receipt_Info_ViewModel demodel)
        {
            if (demodel.Id > 0)
            {
                var model = receipt_InfoRepository.GetEntity(demodel.Id);
                if (model == null) { return "收据不存在"; }
                if (model.State == 1) { return "收据已被认领,无法修改"; }
                if (model.CreateBy != demodel.CreateBy) { return "无法修改"; }
                Dictionary<string, object> keyValues = new Dictionary<string, object>()
                {
                    { nameof(RB_Receipt_Info_ViewModel.Remitter), demodel.Remitter},
                    { nameof(RB_Receipt_Info_ViewModel.Remark), demodel.Remark},
                    { nameof(RB_Receipt_Info_ViewModel.UpdateBy), demodel.UpdateBy},
                    { nameof(RB_Receipt_Info_ViewModel.UpdateTime), demodel.UpdateTime},
                };
                List<WhereHelper> wheres = new List<WhereHelper>() {
                    new WhereHelper(){
                         FiledName = nameof(RB_Receipt_Info_ViewModel.Id),
                          FiledValue= demodel.Id,
                           OperatorEnum=OperatorEnum.Equal
                    }
                };
                bool flag = receipt_InfoRepository.Update(keyValues, wheres);
                return flag ? "" : "出错了,请联系管理员";
            }
            else {
                var list = receipt_InfoRepository.GetList(new RB_Receipt_Info_ViewModel() { Group_Id = demodel.Group_Id, FinanceId = demodel.FinanceId });
                if (list.Any()) { return "该单据已生成收据,无法重复生成"; }
                var fmodel = RB_FinanceRepository.GetEntity(demodel.FinanceId);
                if (fmodel == null) { return "单据不存在"; }
                if (fmodel.CreateBy != demodel.CreateBy) { return "不是制单人无法创建"; }
                #region 验证流程
                var configModel = receipt_ConfigRepository.GetList(new RB_Receipt_Config_ViewModel() { Group_Id = demodel.Group_Id }).FirstOrDefault();
                if (configModel == null || configModel.Enable != 1) { return "收据未启用,无法新增收据"; }
                if (!("," + configModel.TempleteIds + ",").Contains("," + (fmodel.TemplateId ?? 0) + ",")) {
                    return "该单据流程未启用收据功能,无法新增收据";
                }
                #endregion
                //获取数据库最大的序列号
                string MaxReceiptNo = receipt_InfoRepository.GetMaxReceiptNo(demodel.Group_Id);
                if (MaxReceiptNo == "") { MaxReceiptNo = "80000001"; }
                else
                {
                    MaxReceiptNo = (Convert.ToInt32(MaxReceiptNo) + 1).ToString();
                }
                demodel.ReceiptNo = MaxReceiptNo;
                demodel.ClaimCode = new Random().Next(1000, 9999);
                bool flag = receipt_InfoRepository.Insert(demodel) > 0;
                return flag ? "" : "出错了,请联系管理员";
            }
        }

        /// <summary>
        /// 删除收据信息
        /// </summary>
        /// <param name="receiptId"></param>
        /// <param name="userInfo"></param>
        /// <returns></returns>
        public string DelReceiptInfo(int receiptId, UserInfo userInfo)
        {
            var model = receipt_InfoRepository.GetEntity(receiptId);
            if (model == null || model.Status == 1) { return "收据不存在"; }
            if (model.State == 1) { return "收据已认领,无法删除"; }
            if (model.CreateBy != userInfo.Id) { return "无法删除"; }
            Dictionary<string, object> keyValues = new Dictionary<string, object>()
            {
                { nameof(RB_Receipt_Info_ViewModel.Status), 1},
                { nameof(RB_Receipt_Info_ViewModel.UpdateBy), userInfo.Id},
                { nameof(RB_Receipt_Info_ViewModel.UpdateTime), DateTime.Now},
            };
            List<WhereHelper> wheres = new List<WhereHelper>() {
                new WhereHelper(){
                     FiledName = nameof(RB_Receipt_Info_ViewModel.Id),
                      FiledValue = receiptId,
                       OperatorEnum = OperatorEnum.Equal
                }
            };
            bool flag = receipt_InfoRepository.Update(keyValues, wheres);
            return flag ? "" : "出问题了,请联系管理员";
        }
        #endregion
    }
}