using Dm;
using Npgsql.Replication.PgOutput;
using OASystem.Domain.Entities.Financial;
using OASystem.Domain.ViewModels.System;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;

namespace OASystem.Domain.ViewModels.Financial
{
    /// <summary>
    /// 日付申请 View
    /// </summary>
    public class Fin_DailyFeePaymentView : Fin_DailyFeePayment
    { }

    public class Fin_DailyFeePaymentPageCount
    {
        /// <summary>
        /// 总条数
        /// </summary>
        public int Count { get; set; }
    }

    /// <summary>
    /// 日付申请 分页查询View
    /// </summary>
    public class Fin_DailyFeePaymentPageListView
    {
        /// <summary>
        /// 是否选中
        /// </summary>
        public bool IsChecked { get; set; }

        /// <summary>
        /// 行号
        /// </summary>
        public int RowNumber { get; set; }

        /// <summary>
        /// Id
        /// </summary>
        public int Id { get; set; }

        /// <summary>
        /// 公司Id
        /// </summary>
        public int CompanyId { get; set; }

        /// <summary>
        /// 公司名称
        /// </summary>
        public string? CompanyName { get; set; }

        /// <summary>
        /// 费用描述
        /// </summary>
        public string? Instructions { get; set; }

        /// <summary>
        /// 费用总计
        /// </summary>
        public decimal? SumPrice { get; set; }

        /// <summary>
        /// 申请人Id
        /// </summary>
        public int CreateUserId { get; set; }

        /// <summary>
        /// 申请人姓名
        /// </summary>
        public string? CreateUser { get; set; }

        /// <summary>
        /// 申请时间
        /// </summary>
        public DateTime CreateTime { get; set; }

        /// <summary>
        /// 财务审核
        /// </summary>
        public int FAudit { get; set; }

        /// <summary>
        /// 财务 审核状态
        /// </summary>
        public string? FAuditDesc
        {
            get
            {
                string str = "未审核";
                if (FAudit == 0) str = "未审核";
                else if (FAudit == 1)
                {
                    str = "已通过";
                    FAuditName = "朱成梅";
                }
                else if (FAudit == 2)
                {
                    str = "未通过";
                    FAuditName = "朱成梅";
                }
                return str;
            }
        }

        /// <summary>
        /// 财务审核人姓名
        /// </summary>
        public string? FAuditName { get; set; } = "无";

        /// <summary>
        /// 总经理审核
        /// </summary>
        public int MAudit { get; set; }

        /// <summary>
        /// 总经理 审核状态
        /// </summary>
        public string? MAuditDesc
        {
            get
            {
                string str = "未审核";
                if (MAudit == 0) str = "未审核";
                else if (MAudit == 1) { str = "已通过"; MAuditName = "张海麟"; }
                else if (MAudit == 2) { str = "未通过"; MAuditName = "张海麟"; }
                return str;
            }
        }

        /// <summary>
        /// 总经理审核姓名
        /// </summary>
        public string? MAuditName { get; set; } = "无";

        /// <summary>
        /// 费用类型
        /// </summary>
        public int PriceTypeId { get; set; }

        /// <summary>
        /// 支付标识 0,1
        /// </summary>
        public int IsPay { get; set; }
    }

    /// <summary>
    /// 日服申请 分页
    /// </summary>
    public class Fin_DailyFeePaymentPage
    {
        /// <summary>
        /// 总条数
        /// </summary>
        public int? Rows { get; set; }

        public List<Fin_DailyFeePaymentPageListView> Data { get; set; }
    }

    /// <summary>
    /// 日付申请费用明细
    /// </summary>
    public class Fin_DailyFeePaymentContentInfolView
    {
        public int Id { get; set; }
        /// <summary>
        /// 费用名称
        /// </summary>
        public string PriceName { get; set; }

        /// <summary>
        /// 数量单价
        /// </summary>
        public decimal Quantity { get; set; }

        /// <summary>
        /// 费用单价
        /// </summary>
        public decimal Price { get; set; }

        /// <summary>
        /// 当前总计
        /// </summary>
        public decimal ItemTotal { get; set; }

        /// <summary>
        /// 备注
        /// </summary>
        public string Remark { get; set; }

        /// <summary>
        /// 备注描述
        /// </summary>
        public string RemaksDescription { get; set; }

        /// <summary>
        /// Excel备注描述
        /// </summary>
        public string ExcelRemaksDescription { get; set; }
    }

    public class Fin_DailyFeePaymentInfolView
    {
        public int Id { get; set; }
        public int CompanyId { get; set; }
        public int TransferTypeId { get; set; }
        public int PriceTypeId { get; set; }
        public string Instructions { get; set; }
        public decimal SumPrice { get; set; }

        public int CreateUserId { get; set; }

        /// <summary>
        /// 财务审核
        /// </summary>
        public int FAudit { get; set; }

        public string FAuditDesc
        {
            get
            {
                string str = "未审核";
                if (FAudit == 0) str = "未审核";
                else if (FAudit == 1) str = "已通过";
                else if (FAudit == 2) str = "未通过";
                return str;
            }
        }

        /// <summary>
        /// 总经理审核
        /// </summary>
        public int MAudit { get; set; }

        public string MAuditDesc
        {
            get
            {
                string str = "未审核";
                if (MAudit == 0) str = "未审核";
                else if (MAudit == 1) str = "已通过";
                else if (MAudit == 2) str = "未通过";
                return str;
            }
        }

        public DateTime CreateTime { get; set; }
        public List<Fin_DailyFeePaymentContentInfolView> FeeContents { get; set; }
    }

    /// <summary>
    /// android 详情
    /// </summary>
    public class Fin_DailyFeePaymentInfoAndroidlView
    {
        public int Id { get; set; }
        public int CompanyId { get; set; }
        public int TransferTypeId { get; set; }
        public int PriceTypeId { get; set; }
        public string Instructions { get; set; }
        public decimal SumPrice { get; set; }

        public int CreateUserId { get; set; }

        public List<Fin_DailyFeePaymentContentInfolView> FeeContents { get; set; }
    }

    /// <summary>
    /// 费用类型
    /// </summary>
    public class Fin_DailyFeePaymentPagePriceTypeView
    {
        /// <summary>
        /// 类型Id
        /// </summary>
        public int Id { get; set; }

        /// <summary>
        /// 名称
        /// </summary>
        public string Name { get; set; }
    }

    /// <summary>
    /// 费用子类型
    /// </summary>
    public class Fin_DailyFeePaymentPagePriceSubTypeView
    {
        /// <summary>
        /// 费用类型Id
        /// </summary>
        public int STid { get; set; }

        /// <summary>
        /// 子类型Id
        /// </summary>
        public int Id { get; set; }

        /// <summary>
        /// 子类型名称
        /// </summary>
        public string Name { get; set; }
    }

    /// <summary>
    /// 费用类型数据源
    /// </summary>
    public class Fin_DailyFeePaymentPagePriceTypeDataView
    {
        /// <summary>
        /// 费用类型
        /// </summary>
        public List<Fin_DailyFeePaymentPagePriceTypeView>? FeeTypeData { get; set; }

        /// <summary>
        /// 费用子类型
        /// </summary>
        public List<Fin_DailyFeePaymentPagePriceSubTypeView>? FeeSubTypeData { get; set; }

        /// <summary>
        /// 用户名称
        /// </summary>
        public List<UserNameView>? UserNameData { get; set; }

        /// <summary>
        /// 费用标识类型
        /// </summary>
        public List<Fin_DailyFeePaymentPagePriceTypeView>? FeeMarkTypeData { get; set; }

        /// <summary>
        /// 费用子类型
        /// </summary>
        public List<Fin_DailyFeePaymentPagePriceSubTypeView>? FeeMarkSubTypeData { get; set; }

        /// <summary>
        /// 公司名称
        /// </summary>
        public List<CompanyNameView>? CompanyNameData { get; set; }
    }

    /// <summary>
    /// 类型数据源
    /// </summary>
    public class DailyFeePaymentDataSourceView : Fin_DailyFeePaymentPagePriceTypeView
    {
        public List<Fin_DailyFeePaymentPagePriceSubTypeView> SubDatas { get; set; }
    }

    public class tree_Fin_DailyFeePaymentPageListView : Fin_DailyFeePaymentPageListView
    {
        public List<Fin_DailyFeePaymentContentInfolView> childList { get; set; }
        public string priceTypeStr { get; set; }

        public int transferTypeId { get; set; }
        public string transferTypeIdStr { get; set; }
        /// <summary>
        /// 公转:62,私转:63 --2024年4月9日 16:49:46 0,1
        /// </summary>
        public int transferParentId { get; set; }
        public string transferParentIdStr { get; set; }
    }

    public class tree_Fin_DailyFeePaymentResult : tree_Fin_DailyFeePaymentPageListView
    {
        public decimal gz { get; set; } = 0M;
        public decimal sz { get; set; } = 0M;

        public List<tree_Fin_DailyFeePaymentPageListView> dataList { get; set; }
    }


    /// <summary>
    /// 团组相关费用
    /// </summary>
    public class tree_Group_DailyFeePaymentResult
    {
        public decimal gz { get; set; } = 0M;
        public decimal sz { get; set; } = 0M;

        public List<tree_Group_DailyFeePaymentPageListView> dataList { get; set; }
    }

    /// <summary>
    /// 团组相关费用 List
    /// </summary>
    public class tree_Group_DailyFeePaymentPageListView
    {
        public string Id { get; set; }

        public string GroupName { get; set; }

        /// <summary>
        /// 费用所属公司Id
        /// </summary>
        public int CompanyId { get; set; }

        /// <summary>
        /// 费用所属公司
        /// </summary>
        public string ConpanyName { get; set; }

        /// <summary>
        /// 团组总计金额
        /// </summary>
        public decimal CNYTotalAmount { get; set; }

        public List<Group_DailyFeePaymentContentInfolView> ChildList { get; set; }
    }

    public class CompanyInfo
    {
        public int Id { get; set; }
        public string ConpanyName { get; set; }
    }

    public class Group_DailyFeePaymentContentInfolView
    {
        /// <summary>
        /// 是否选中
        /// </summary>
        public bool IsChecked { get; set; }

        public int Id { get; set; }

        /// <summary>
        /// 酒店费用子类 Id
        /// </summary>
        public int HotelSubId { get; set; } = -1;

        /// <summary>
        /// 支付方式
        /// </summary>
        public string PayType { get; set; }

        /// <summary>
        /// 转账标识
        /// </summary>
        public string TransferMark { get; set; }
        /// <summary>
        /// 序号
        /// </summary>
        public int RowNumber { get; set; }

        /// <summary>
        /// 申请人
        /// </summary>
        public string Applicant { get; set; }

        /// <summary>
        /// 申请时间
        /// </summary>
        public string ApplicantDt { get; set; }

        /// <summary>
        /// 收款方
        /// </summary>
        public string Payee { get; set; }

        /// <summary>
        /// 费用名称
        /// </summary>
        public string PriceName { get; set; }

        /// <summary>
        /// 费用所属模块
        /// </summary>
        public string ModuleName { get; set; }

        /// <summary>
        /// 付款币种
        /// </summary>
        public string PayCurrCode { get; set; }

        /// <summary>
        /// 付款金额
        /// </summary>
        public decimal PaymentAmount { get; set; }

        /// <summary>
        /// 付款汇率
        /// </summary>
        public decimal PayRate { get; set; }

        /// <summary>
        /// 小计人民币金额
        /// </summary>
        public decimal CNYSubTotalAmount { get; set; }

        /// <summary>
        /// 费用描述 
        /// </summary>
        public string RemaksDescription { get; set; }

        /// <summary>
        /// 审核状态
        /// 0 未审核 1已通过 2未通过 3 自动审核
        /// </summary>
        public int AuditStatus { get; set; }
    }

    public class PaymentRequestCheckedView
    {
        public List<int> GroupIds { get; set; }

        public List<int> DailyPaymentIds { get; set; }

        public List<int> HotelSubIds { get; set; }
    }

    #region 日付报表

    [SqlSugar.SugarTable("Fin_DailyFeePayment")]
    public class DailyFeePaymentRangeView
    {
        //public string ViewStr
        //{
        //    get
        //    {
        //        return $"{RowIndex}、【{CompanyName}】【{TransferType}】【{FeeType}】【{Instructions}】【{SumPrice.ToString("#0.00")}】【申请人:{Applicant}  申请时间:{ApplicantDt.ToString("yyyy-MM-dd HH:mm:ss")}】";
        //    }
        //}

        public string ViewStr
        {
            get
            {
                return $"【{CompanyName}】【{TransferType}】【{FeeType}】【{Instructions}】【{SumPrice.ToString("#0.00")}】【申请人:{Applicant}  申请时间:{ApplicantDt.ToString("yyyy-MM-dd HH:mm:ss")}】";
            }
        }

        [SugarColumn(IsIgnore = true)]//需要加上
        public int RowIndex { get; set; } //行号 序号
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
        public int Id { get; set; }
        public string Instructions { get; set; }
        public int PriceTypeId { get; set; }
        public string FeeType { get; set; }
        public int TransferTypeId { get; set; }
        public string TransferType { get; set; }
        public decimal SumPrice { get; set; }
        public DateTime FAuditDate { get; set; }
        public DateTime MAuditDate { get; set; }
        public int CompanyId { get; set; }
        public string CompanyName { get; set; }
        public int ApplicantId { get; set; }
        public string Applicant { get; set; }
        public DateTime ApplicantDt { get; set; }

        [Navigate(NavigateType.OneToMany, nameof(DailyFeePaymentContentView.DFPId))]//BookA表中的studenId
        public List<DailyFeePaymentContentView> Contents { get; set; }


        //public string ContentStr { get; set; }
    }


    [SqlSugar.SugarTable("Fin_DailyFeePaymentContent")]
    public class DailyFeePaymentContentView
    {

        //[SugarColumn(IsIgnore = true)]//需要加上
        //public int RowIndex { get; set; } //行号 序号
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
        public int Id { get; set; }

        public int DFPId { get; set; }

        public string PriceName { get; set; }

        public int Quantity { get; set; }

        public decimal Price { get; set; }

        public decimal ItemTotal { get; set; }

        public string Remark { get; set; }

        //public int IsDel { get; set; }

        /// <summary>
        /// 示例:费用名称:[2024.07.11招商信用卡还款]   单价:[20000.00]   数量:[1.00]   小计:[20000.00]   备注:[]
        /// </summary>
        //public string ViewStr
        //{
        //    get
        //    {
        //        return $"费用名称:[{PriceName}]   单价:[{Price.ToString("#0.00")}]   数量:[{Quantity.ToString("#0.00")}]   小计:[{ItemTotal.ToString("#0.00")}]   备注:[{Remark}]";
        //    }
        //}

        //public string ViewSubStr { get; set; }
    }


    public class ExcelView : DailyFeePaymentRangeView
    {
        public string ContentStr { get; set; }
    }

    #endregion

    #region 统计模块

    #region YOY

    public class StatisticsYOYView
    {
        public int Id { get; set; }
        public DateTime VisitDate { get; set; }

        public int Year { get; set; }
        public int Month { get; set; }

        /// <summary>
        /// 销售额金额
        /// </summary>
        public decimal SaleAmount { get; set; }

        /// <summary>
        /// 机票金额
        /// </summary>
        public decimal AirTicketAmount { get; set; }

        /// <summary>
        /// op金额
        /// </summary>
        public decimal OPAmount { get; set; }

        /// <summary>
        /// 其他费用金额
        /// </summary>
        public decimal OtherCostAmount { get; set; }

        /// <summary>
        /// 签证金额
        /// </summary>
        public decimal VisaAmount { get; set; }

        /// <summary>
        /// 邀请公务金额
        /// </summary>
        public decimal OAAmount { get; set; }

        /// <summary>
        /// 保险金额
        /// </summary>
        public decimal InsureAmount { get; set; }

        /// <summary>
        /// 酒店金额
        /// </summary>
        public decimal HotelAmount { get; set; }

        /// <summary>
        /// 超支金额
        /// </summary>
        public decimal ExcessAmount { get; set; }

        /// <summary>
        /// 收款退还金额
        /// </summary>
        public decimal SKTHAmount { get; set; }

        /// <summary>
        /// 成本金额
        /// </summary>
        public decimal CostAmount
        {
            get
            {
                return AirTicketAmount + HotelAmount + InsureAmount + OAAmount + VisaAmount + OtherCostAmount + OPAmount + ExcessAmount;
            }
        }

        /// <summary>
        /// 毛利润
        /// </summary>
        public decimal GrossProfitAmount
        {
            get
            {
                return SaleAmount - SKTHAmount - CostAmount;
            }
        }

    }
    public class YOYReturnView
    {
        public int Year { get; set; }
        public int Month { get; set; }

        public decimal ThisAmount { get; set; }
        public decimal LastAmount { get; set; }

        public string Yoy { get; set; }

        public List<int> ThisIds { get; set; }
        public List<int> LastIds { get; set; }

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="year"></param>
        /// <param name="month"></param>
        /// <param name="thisAmount"></param>
        /// <param name="lastAmount"></param>
        /// <param name="thisIds"></param>
        /// <param name="lastIds"></param>
        public YOYReturnView(int year, int month, decimal thisAmount, decimal lastAmount, List<int> thisIds, List<int> lastIds)
        {
            this.Year = year;
            this.Month = month;
            this.ThisAmount = thisAmount;
            this.LastAmount = lastAmount;
            string _yoy = "0.00%";
            if (lastAmount != 0)
            {
                _yoy = ((thisAmount - lastAmount) / lastAmount).ToString("#0.00") + "%";
            }

            this.Yoy = _yoy;
            this.ThisIds = thisIds;
            this.LastIds = lastIds;
        }
    }

    #endregion

    #region 国交数据统计 - 机票

    public class StatisticsAirTicketView
    {
        public int DIId { get; set; }
        public DmDateTime FlightsDate { get; set; }
        public int Year { get; set; }
        public int Month { get; set; }
        public int CType { get; set; }
        public string CTypeName { get; set; }
        public string FlightsCity { get; set; }
        public string FlightsCityName { get; set; }
        public int ClientNum { get; set; }
    }

    public class AirTicketReturnView
    {
        public int Year { get; set; }
        public int Month { get; set; }

        /// <summary>
        /// 票数
        /// </summary>
        public int Quantity { get; set; }

        public List<AitTicketInfo> AitTicketInfos { get; set; }


        public List<int> LinkGroupIds { get; set; }


        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="year"></param>
        /// <param name="month"></param>
        /// <param name="quantity"></param>
        /// <param name="linkGroupIds"></param>
        public AirTicketReturnView(int year, int month, int quantity, List<AitTicketInfo> aitTicketInfos, List<int> linkGroupIds)
        {
            this.Year = year;
            this.Month = month;
            this.Quantity = quantity;
            this.AitTicketInfos = aitTicketInfos;
            this.LinkGroupIds = linkGroupIds;
        }
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="year"></param>
        /// <param name="month"></param>
        /// <param name="quantity"></param>
        /// <param name="linkGroupIds"></param>
        public AirTicketReturnView(int year, int month, int quantity, List<int> linkGroupIds)
        {
            this.Year = year;
            this.Month = month;
            this.Quantity = quantity;
            this.LinkGroupIds = linkGroupIds;
        }
    }


    public class AirTicketCityReturnView : AirTicketReturnView
    {
        public List<AirTicketCityInfo> CityData { get; set; }
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="year"></param>
        /// <param name="month"></param>
        /// <param name="quantity"></param>
        /// <param name="linkGroupIds"></param>
        public AirTicketCityReturnView(int year, int month, int quantity, List<AirTicketCityInfo> cityData, List<int> linkGroupIds)
            : base(year, month, quantity, linkGroupIds)
        {
            this.Year = year;
            this.Month = month;
            this.Quantity = quantity;
            this.CityData = cityData;
            this.LinkGroupIds = linkGroupIds;
        }
    }
    public class AitTicketInfo
    {
        public int Id { get; set; }

        public string GroupName { get; set; }

        public int Quantity { get; set; }

        public AitTicketInfo(int id, string groupName, int quantity)
        {
            this.Id = id;
            this.GroupName = groupName;
            this.Quantity = quantity;

        }

    }

    public class AirTicketCityInfo
    {
        public string City { get; set; }

        public int Quantity { get; set; }

        public AirTicketCityInfo(string city, int quantity = 0)
        {
            City = city;
            Quantity = quantity;
        }
    }


    #endregion

    #region 酒店
    public class StatisticsHotelView
    {
        public int DIId { get; set; }
        public string City { get; set; }
        public string CityStr
        {
            get
            {
                return City.Replace(" ", "").ToUpper();
            }
        }
        public string HotelName { get; set; }
        public string BookinSite { get; set; }
        public string CheckInDate { get; set; }
        //public int Year { get; set; }
        //public int Month { get; set; }
        public string CheckOutDate { get; set; }
        public int SingleRoomCount { get; set; }
        public int DoubleRoomCount { get; set; }
        public int SuiteRoomCount { get; set; }
        public int OtherRoomCount { get; set; }

        public int RoomNights
        {
            get
            {
                int nights = 0;
                if (!string.IsNullOrEmpty(CheckInDate) && !string.IsNullOrEmpty(CheckOutDate))
                {
                    DateTime checkin, checkout;
                    bool checkInBool = DateTime.TryParse(CheckInDate, out checkin);
                    bool checkOutBool = DateTime.TryParse(CheckOutDate, out checkout);
                    if (checkInBool && checkOutBool)
                    {
                        nights = (checkout - checkin).Days * RoomTotal;
                    }
                }
                return nights;
            }
        }

        public int RoomTotal
        {
            get
            {
                return SingleRoomCount + DoubleRoomCount + SuiteRoomCount + OtherRoomCount;
            }
        }

        public StatisticsHotelView() { }

        public StatisticsHotelView(int diid, string city, string hotelName, string bookingSite, string checkIn, string checkOut, int singleRoom, int doubleRoomCount, int suiteRoomCount, int otherRoomCount)
        {
            DIId = diid;
            City = city;
            BookinSite = bookingSite;
            CheckInDate = checkIn;
            CheckOutDate = checkOut;
            SingleRoomCount = singleRoom;
            DoubleRoomCount = doubleRoomCount;
            SuiteRoomCount = suiteRoomCount;
            OtherRoomCount = otherRoomCount;
        }
    }


    public class HotelReturnView
    {

    }

    #endregion

    #region 商邀邀请
    public class StatisticsInvitation
    {
        public int DIId { get; set; }
        public string Country { get; set; }
    }
    #endregion

    #region 团组相关

    public class StatisticsGroupInfoEntity
    {
        public int Id { get; set; }
        public DateTime VisitDate { get; set; }
        public int Month { get; set; }

        public string MonthName { get { return VisitDate.ToString("MMM", CultureInfo.GetCultureInfo("zh-CN")); } }

        public int Quarter
        {
            get
            {
                int quarter = 0;
                if (Month < 1 || Month > 12) return quarter;
                if (Month >= 1 && Month <= 3) quarter = 1;
                else if (Month >= 4 && Month <= 6) quarter = 2;
                else if (Month >= 7 && Month <= 9) quarter = 3;
                else if (Month >= 10 && Month <= 12) quarter = 4;
                return quarter;
            }
        }

        public string QuarterName
        {
            get
            {
                string quarterName = "-";
                if (Month < 1 || Month > 12) return quarterName;
                if (Month >= 1 && Month <= 3) quarterName = "第一季度";
                else if (Month >= 4 && Month <= 6) quarterName = "第二季度";
                else if (Month >= 7 && Month <= 9) quarterName = "第三季度";
                else if (Month >= 10 && Month <= 12) quarterName = "第四季度";
                return quarterName;
            }
        }
        public int VisitPNumber { get; set; }
    }

    #endregion

    #region OP
    public class StatisticsOP
    {
        /*
         * OP统计图(实际成本同比年/月)
         *分块:如车费/导游费/导游交通/接送机费/司机工资/翻译费 	
         *用于判断实际成本是否有增长【真实使用的时候估计是2025年和2024年对比,2023年的数据格式和数据量有问题】
         * 
         * 车费:91	车费  982 车超时费
         * 导游费:92 导游费  985 导游交通  1059 导游超时费用
         * 司机费:979 司机工资    
         * 小费:980 司机小费 95 导游小费
         * 接送机费:96 接送机费  
         * 餐费:93	客户午餐费用  981 司机餐补  983	导游餐补  988 客户早餐费用  989	客户晚餐费用  
         *       1074 早餐超支费用  1075 午餐超支费用  1076 晚餐超支费用
         * 住补费:992 住补费用  984 导游房补
         * 景点费:94 导游景点费  990	景点门票费  1085 景点门票超支费用
         * 翻译费:994 翻译费  1073	翻译超时费
         * 饮料/零食/水果费:991 饮料/零食/水果
         * 其他费:97 其他费用  1071 其他额外费用
         */
        //车费
        private static int[] _carFeeIds = new int[] {
                                            91,   //车费
                                            982,  //车超时费
                                        };
        //导游费
        private static int[] _guideFeeIds = new int[] {
                                                92,   //导游费
                                                985,  //导游交通
                                                1059, //导游超时费用
                                            };
        //司机费
        private static int[] _driverFeeIds = new int[]{
                                                979,  //司机工资
                                            };
        //小费
        private static int[] _tipsFeeIds = new int[] {
                                               980,  //司机小费
                                               95,   //导游小费
                                            };
        //接送机费
        private static int[] _airportTransferFeeIds = new int[] {
                                                         96,  //接送机费
                                                      };
        //餐费
        private static int[] _mealFeeIds = new[] {
                                          93,  //客户午餐费用
                                          981, //司机餐补
                                          983, //导游餐补
                                          988, //客户早餐费用
                                          989, //客户晚餐费用
                                          1074,//早餐超支费用
                                          1075,//午餐超支费用
                                          1076,//晚餐超支费用
                                       };
        //住补费
        private static int[] _sububoFeeIds = new[] {
                                         992,  //住补费用  
                                         984,  //导游房补
                                       };
        //景点费
        private static int[] _scenicSpotFeeIds = new[] {
                                        94,  //导游景点费  
                                        990, //景点门票费  
                                        1085,//景点门票超支费用
                                       };
        //翻译费
        private static int[] _translationFeeIds = new[] {
                                                994,  //翻译费  
                                                1073, //翻译超时费
                                               };
        //饮料/零食/水果费
        private static int[] _DSFFeeIds = new int[] {
                                             991,  //饮料/零食/水果
                                         };
        //其他费
        private static int[] _otherFeeIds = new int[] {
                                                97,  //其他费用  
                                                1071,//其他额外费用
                                            };


        public int Id { get; set; }
        public int DiId { get; set; }
        public DateTime PaymentTime { get; set; }
        public int Year { get; set; }
        public int Quarter { get; set; }
        public int Month { get; set; }
        public string Area { get; set; }
        public string Country { get; set; }
        public string City { get; set; }
        public int ParentFeeId {
            get
            {
                return int.TryParse(GetFeeParentInfo(FeeSubType, 1), out int id) ? id : 0;
            }
        }
        public string ParentFeeName
        {
            get
            {
                return GetFeeParentInfo(FeeSubType, 2);
            }
        }

        public string ParentFeeRemark { get; set; }
        public int FeeType { get; set; }
        public string FeeTypeName { get; set; }
        public int FeeSubType { get; set; }
        public string FeeSubTypeName { get; set; }

        public decimal Price { get; set; }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="subFee"></param>
        /// <param name="type">1 id 2 name 3 备注 </param>
        /// <returns></returns>
        private static string GetFeeParentInfo(int subFee,int type)
        {
           int id = -1;
           string name =string.Empty;
           string remark = string.Empty;
            // 车费:91 车费  982 车超时费
            if (_carFeeIds.Contains(subFee))
            {
                id = 1;
                name = "车费";
                remark = "费用组成:车费、车超时费";
            }
            // 导游费:92 导游费  985 导游交通  1059 导游超时费用
            if (_guideFeeIds.Contains(subFee))
            {
                id = 2;
                remark = "费用组成:导游费、导游交通、导游超时费用";
                name = "导游费";
            }
            // 司机费:979 司机工资
            if (_driverFeeIds.Contains(subFee))
            {
                id = 3;
                remark = "费用组成:司机工资";
                name = "司机费";
            }
            // 小费:980 司机小费 95 导游小费
            if (_tipsFeeIds.Contains(subFee))
            {
                id = 4;
                remark = "费用组成:司机小费、导游小费";
                name = "小费";
            }
            // 接送机费:96 接送机费
            if (_airportTransferFeeIds.Contains(subFee))
            {
                id = 5;
                remark = "费用组成:接送机费";
                name = "接送机费";
            }
            // 餐费:93 客户午餐费用  981 司机餐补  983   导游餐补  988 客户早餐费用  989   客户晚餐费用
            // 1074 早餐超支费用  1075 午餐超支费用  1076 晚餐超支费用
            if (_mealFeeIds.Contains(subFee))
            {
                id = 6;
                remark = "费用组成:客户早餐费用、客户午餐费用、客户晚餐费用、司机餐补、导游餐补、早餐超支费用、午餐超支费用、晚餐超支费用";
                name = "餐费";
            }
            // 住补费:992 住补费用  984 导游房补
            if (_sububoFeeIds.Contains(subFee))
            {
                id = 7;
                remark = "费用组成:住补费用、导游房补";
                name = "住补费";
            }
            // 景点费:94 导游景点费  990 景点门票费  1085 景点门票超支费用
            if (_scenicSpotFeeIds.Contains(subFee))
            {
                id = 8;
                remark = "费用组成:导游景点费、景点门票费、景点门票超支费用";
                name = "景点费";
            }
            // 翻译费:994 翻译费  1073 翻译超时费
            if (_translationFeeIds.Contains(subFee))
            {

                id = 9;
                remark = "费用组成:翻译费、翻译超时费";
                name = "翻译费";
            }
            // 饮料/ 零食 / 水果费:991 饮料 / 零食 / 水果
            if (_DSFFeeIds.Contains(subFee))
            {
                id = 10;
                remark = "费用组成:饮料/零食/水果费";
                name = "饮料/零食/水果费";
            }
            // 其他费用:97 其他费用  1071 其他额外费用
            if (_otherFeeIds.Contains(subFee))
            {
                id = 11;
                remark = "费用组成:其他费用、其他额外费用";
                name = "其他费用";
            }

            string returnStr = string.Empty;
            if (type == 1) returnStr = id.ToString();
            else if (type == 2) returnStr = name;
            else if (type == 3) returnStr = remark;

            return returnStr;
        }
    }


      



    public class StatisticsOPYOY
    {
        public int FeeId { get; set; }
        public string FeeName { get; set; }
        /// <summary>
        /// 本期
        /// </summary>
        public decimal CurrPeriodFee { get; set; }
        /// <summary>
        /// 同期
        /// </summary>
        public decimal SamePeriodFee { get; set; }
        public decimal Yoy { get; set; }
        public int CurrPeriodGroupTotal { get; set; }
        public int SamePeriodGroupTotal { get; set; }
        public StatisticsOPSubFeeYOY[] SubFeeData { get; set; }

        public StatisticsOPYOY() { }

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="year"></param>
        /// <param name="month"></param>
        /// <param name="thisAmount"></param>
        /// <param name="lastAmount"></param>
        /// <param name="thisIds"></param>
        /// <param name="lastIds"></param>
        public StatisticsOPYOY(int feeId, string feeName, decimal currPeriodFee, decimal samePeriodFee,
           int currPeriodGroupTotal ,int samePeriodGroupTotal, StatisticsOPSubFeeYOY[] subFeeData)
        {
            this.FeeId = feeId;
            this.FeeName = feeName;
            this.CurrPeriodFee = currPeriodFee;
            this.SamePeriodFee = samePeriodFee;
            decimal _yoy = 0.00M;
            if (samePeriodFee != 0.00M)
            {
                _yoy = (currPeriodFee - samePeriodFee) / samePeriodFee;
            }

            this.Yoy = decimal.Parse(_yoy.ToString("0.##")); 
            this.CurrPeriodGroupTotal = currPeriodGroupTotal;
            this.SamePeriodGroupTotal = samePeriodGroupTotal;
            this.SubFeeData = subFeeData;
        }
    }

    public class StatisticsOPSubFeeYOY : StatisticsOPYOY
    {
        public StatisticsOPCityYOY[] CityData { get; set; }

        public StatisticsOPSubFeeYOY() { }
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="year"></param>
        /// <param name="month"></param>
        /// <param name="thisAmount"></param>
        /// <param name="lastAmount"></param>
        /// <param name="thisIds"></param>
        /// <param name="lastIds"></param>
        public StatisticsOPSubFeeYOY(int feeId, string feeName, decimal currPeriodFee, decimal samePeriodFee,
           int currPeriodGroupTotal, int samePeriodGroupTotal, StatisticsOPCityYOY[] cityData)
        {
            this.FeeId = feeId;
            this.FeeName = feeName;
            this.CurrPeriodFee = currPeriodFee;
            this.SamePeriodFee = samePeriodFee;
            decimal _yoy = 0.00M;
            if (samePeriodFee != 0.00M)
            {
                _yoy = (currPeriodFee - samePeriodFee) / samePeriodFee;
            }
            this.Yoy = decimal.Parse(_yoy.ToString("0.##"));
            this.CurrPeriodGroupTotal = currPeriodGroupTotal;
            this.SamePeriodGroupTotal = samePeriodGroupTotal;
            this.CityData = cityData;
        }
    }

    public class StatisticsOPCityYOY
    {
        public string CityName { get; set; }

        public int CurrPeriodGroupTotal { get; set; }
        public int SamePeriodGroupTotal { get; set; }

        /// <summary>
        /// 本期
        /// </summary>
        public decimal CurrPeriodFee { get; set; }
        /// <summary>
        /// 同期
        /// </summary>
        public decimal SamePeriodFee { get; set; }
        public decimal Yoy { get; set; }

        public StatisticsOPCityYOY() { }

        public StatisticsOPCityYOY(string cityName, decimal currPeriodFee, decimal samePeriodFee,
            int currPeriodGroupTotal,int samePeriodGroupTotal) 
        {
            this.CityName = cityName;
            this.CurrPeriodGroupTotal = currPeriodGroupTotal;
            this.SamePeriodGroupTotal = samePeriodGroupTotal;
            this.CurrPeriodFee = currPeriodFee;
            this.SamePeriodFee = samePeriodFee;
            string _yoy = "0.00";
            if (samePeriodFee != 0)
            {
                _yoy = ((currPeriodFee - samePeriodFee) / samePeriodFee).ToString("0.##");
            }

            this.Yoy = decimal.TryParse(_yoy, out decimal yoy1) ? yoy1 : 0.00M;
        }

    }


    public class StatisticsOPMonthYOY
    {
        public int MonthId { get; set; }

        public string MonthName { get; set; }

        public StatisticsOPYOY[] FeeDatas { get; set; }

        public StatisticsOPMonthYOY() { }

        public StatisticsOPMonthYOY(int monthId, string monthName, StatisticsOPYOY[] feeDatas)
        {
            MonthId = monthId;
            MonthName = monthName;
            FeeDatas = feeDatas;
        }
    }

    #endregion
    #endregion
}