using Aspose.Cells;
using EasyBL.WebApi.Message;
using Entity.Sugar;
using Entity.ViewModels;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using SqlSugar;
using SqlSugar.Base;
using System;
using System.Collections.Generic;
using System.Data;
using System.Drawing;
using System.Linq;

namespace EasyBL.WEBAPP.OPM
{
    public class BillStatus_QryService : ServiceBase
    {
        #region 賬單狀態(分頁查詢)

        /// <summary>
        /// 賬單狀態(分頁查詢)
        /// </summary>
        /// <param name="i_crm"></param>
        /// <returns></returns>
        public ResponseMessage QueryPage(RequestMessage i_crm)
        {

            ResponseMessage rm = null;
            string sMsg = null;
            var db = SugarBase.GetIntance();
            try
            {
                do
                {
                    var pml = new PageModel
                    {
                        PageIndex = _fetchInt(i_crm, @"pageIndex"),
                        PageSize = _fetchInt(i_crm, @"pageSize")
                    };
                    var iPageCount = 0;
                    var sSortField = _fetchString(i_crm, @"sortField");
                    var sSortOrder = _fetchString(i_crm, @"sortOrder");
                    var sBillNO = _fetchString(i_crm, @"BillNO");
                    var sExhibitionName = _fetchString(i_crm, @"ExhibitionName");
                    var sExhibitionSN = _fetchString(i_crm, @"ExhibitionSN");
                    var sPayer = _fetchString(i_crm, @"Payer");
                    var sPayerGuid = _fetchString(i_crm, @"PayerGuid");
                    var sResponsiblePerson = _fetchString(i_crm, @"ResponsiblePerson");
                    var sBillStatus = _fetchString(i_crm, @"BillStatus");
                    string sSearchBetween = _fetchString(i_crm, "SearchBetween");   //查詢區間
                    string sBillDateStart = _fetchString(i_crm, "BillDateStart");   //區間起始
                    string sBillDateEnd = _fetchString(i_crm, "BillDateEnd");       //區間結束
                    DateTime dtBillDateStart = DateTime.Now;
                    DateTime dtBillDateEnd = DateTime.Now;

                    var Filter = new CVPFilter();
                    var bExcel = _fetchBool(i_crm, @"Excel");
                    var sExcelType = _fetchString(i_crm, @"ExcelType");
                    var spOrgID = new SugarParameter("@OrgID", i_crm.ORIGID);
                    var spUserID = new SugarParameter("@UserID", i_crm.USERID);

                    var saRoles = db.Queryable<OTB_SYS_MembersToRule>().Where(x => x.OrgID == i_crm.ORIGID && x.MemberID == i_crm.USERID).Select(x => x.RuleID).ToList().ToArray();
                    var saDeptIdsByUser = db.Ado.SqlQuery<string>("SELECT DepartmentId FROM [dbo].[OFN_SYS_GetChilDepartmentIdByUserID](@OrgID,@UserID)", spOrgID, spUserID).ToArray();
                    var saChildUserIds = db.Ado.SqlQuery<string>("SELECT MemberID FROM [dbo].[OFN_SYS_GetMemberIDDownByChief](@OrgID,@UserID)", spOrgID, spUserID).ToArray();
                    var sDeptId = db.Queryable<OTB_SYS_Members>().Single(x => x.OrgID == i_crm.ORIGID && x.MemberID == i_crm.USERID).DepartmentID;
                    var saStatus = sBillStatus.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
                    pml.DataList = db.Queryable<OTB_OPM_BillInfo, OTB_SYS_Members, OTB_SYS_Members, OTB_OPM_Exhibition, OTB_CRM_Customers, OTB_OPM_ExportExhibition, OTB_OPM_ImportExhibition, OTB_OPM_OtherExhibition, OTB_OPM_OtherExhibitionTG>
                        ((t1, t2, t3, t4, t5, t6, t7, t8, t9) =>
                        new object[] {
                                JoinType.Inner, t1.OrgID == t2.OrgID && t1.CreateUser == t2.MemberID,
                                JoinType.Left, t1.OrgID == t3.OrgID && t1.ResponsiblePerson == t3.MemberID,
                                JoinType.Left, t1.OrgID == t4.OrgID && t1.ExhibitionNO == t4.SN.ToString(),
                                JoinType.Left, t1.OrgID == t5.OrgID && t1.Payer == t5.guid,
                                JoinType.Left, t1.OrgID == t6.OrgID && t1.ParentId == t6.ExportBillNO,
                                JoinType.Left, t1.OrgID == t7.OrgID && t1.ParentId == t7.ImportBillNO,
                                JoinType.Left, t1.OrgID == t8.OrgID && t1.ParentId == t8.Guid,
                                JoinType.Left, t1.OrgID == t8.OrgID && t1.ParentId == t9.Guid}
                        )
                        .Where((t1) => t1.OrgID == i_crm.ORIGID)
                        .WhereIF(!string.IsNullOrEmpty(sBillNO), (t1) => t1.BillNO.Contains(sBillNO))
                        .WhereIF(!string.IsNullOrEmpty(sExhibitionName), (t1, t2, t3, t4) => (t4.Exhibitioname_TW + t4.Exhibitioname_EN + t4.ExhibitioShotName_TW).Contains(sExhibitionName))
                        .WhereIF(!string.IsNullOrEmpty(sExhibitionSN), (t1, t2, t3, t4) => SqlFunc.ToString(t4.SN) == sExhibitionSN)
                        .WhereIF(!string.IsNullOrEmpty(sPayer), (t1, t2, t3, t4, t5) => (t5.CustomerCName + t5.CustomerEName).Contains(sPayer))
                        .WhereIF(!string.IsNullOrEmpty(sPayerGuid), (t1, t2, t3, t4, t5) => t5.guid == sPayerGuid)
                        .WhereIF(!string.IsNullOrEmpty(sResponsiblePerson), (t1) => t1.ResponsiblePerson == sResponsiblePerson)
                        .WhereIF(saStatus.Length > 0, (t1) => SqlFunc.ContainsArray(saStatus, t1.AuditVal))
                        //帳單區間
                        .WhereIF(sSearchBetween == "1" && DateTime.TryParse(sBillDateStart, out dtBillDateStart), (t1) => SqlFunc.ToDate(t1.BillFirstCheckDate) >= dtBillDateStart)
                        .WhereIF(sSearchBetween == "1" && DateTime.TryParse(sBillDateEnd, out dtBillDateEnd), (t1) => SqlFunc.ToDate(t1.BillFirstCheckDate) < dtBillDateEnd)
                        //銷帳區間
                        .WhereIF(sSearchBetween == "2" && DateTime.TryParse(sBillDateStart, out dtBillDateStart), (t1) => SqlFunc.ToDate(t1.BillWriteOffDate) >= dtBillDateStart)
                        .WhereIF(sSearchBetween == "2" && DateTime.TryParse(sBillDateEnd, out dtBillDateEnd), (t1) => SqlFunc.ToDate(t1.BillWriteOffDate) < dtBillDateEnd)
                        //帳單創建區間
                        .WhereIF(sSearchBetween == "3" && DateTime.TryParse(sBillDateStart, out dtBillDateStart), (t1) => SqlFunc.ToDate(t1.BillCreateDate) >= dtBillDateStart)
                        .WhereIF(sSearchBetween == "3" && DateTime.TryParse(sBillDateEnd, out dtBillDateEnd), (t1) => SqlFunc.ToDate(t1.BillCreateDate) < dtBillDateEnd)
                        //Excel下載,帳單成本金額
                        .WhereIF(bExcel && sExcelType == "BillAndPrice", (t1) => t1.AuditVal != "6")
                        .Where((t1) => t1.CreateUser == i_crm.USERID || t1.ResponsiblePerson == i_crm.USERID
                        ||
                       //SqlFunc.Subqueryable<OTB_SYS_Members>().Where(c => c.MemberID == t1.ResponsiblePerson && c.OrgID == t1.OrgID).Select(c => c.DepartmentID) == sDeptId ||  //挑選出相同部門的資料
                       //SqlFunc.Subqueryable<OTB_SYS_Members>().Where(p => p.MemberID == t1.CreateUser && p.OrgID == t1.OrgID).Select(c => c.DepartmentID) == sDeptId ////挑選出相同部門的資料
                       //||
                       SqlFunc.Subqueryable<OTB_SYS_Members>().Where(p => p.MemberID == t1.ResponsiblePerson && p.OrgID == t1.OrgID).Select(c => c.ImmediateSupervisor) == i_crm.USERID
                       ||
                       SqlFunc.MappingColumn(t1.BillNO, "[dbo].[OFN_OPM_CheckBillCreateUser](t1.BillType,t1.ParentId)") == i_crm.USERID
                       || SqlFunc.ContainsArray(saChildUserIds, t1.ResponsiblePerson) || SqlFunc.ContainsArray(saRoles, "Account") || SqlFunc.ContainsArray(saRoles, "CDD") || SqlFunc.ContainsArray(saRoles, "Admin") || SqlFunc.ContainsArray(saRoles, "Manager"))
                        .Select((t1, t2, t3, t4, t5, t6, t7, t8, t9) => new View_OPM_BillInfo
                        {
                            OrgID = t1.OrgID,
                            BillNO = t1.BillNO,
                            ExhibitioName = t4.Exhibitioname_TW,
                            BillType = t1.BillType,
                            ParentId = t1.ParentId,
                            IsRetn = t1.IsRetn,
                            ReFlow = t1.ReFlow,
                            PayerName = SqlFunc.IIF(SqlFunc.HasValue(t5.CustomerCName), t5.CustomerCName, t5.CustomerEName),
                            ResponsiblePersonName = t3.MemberName,
                            Currency = t1.Currency,
                            Payer = t1.Payer,
                            Number = t1.Number + t1.Unit,
                            Weight = t1.Weight,
                            Volume = t1.Volume,
                            CreateUserName = t2.MemberName,
                            BillCreateDate = t1.BillCreateDate,
                            AuditVal = t1.AuditVal,
                            ExchangeRate = t1.ExchangeRate,
                            Advance = t1.Advance,
                            AmountSum = t1.AmountSum,
                            TaxSum = t1.TaxSum,
                            AmountTaxSum = t1.AmountTaxSum,
                            TotalReceivable = t1.TotalReceivable,
                            FeeItems = t1.FeeItems,
                            CreateDate = SqlFunc.MappingColumn(t1.CreateDate, "CASE BillType WHEN 'ExhibitionExport_Upd' THEN t6.CreateDate WHEN 'ExhibitionImport_Upd' THEN t7.CreateDate WHEN 'OtherBusiness_Upd' THEN t8.CreateDate WHEN 'OtherExhibitionTG_Upd' THEN t9.CreateDate END"),
                            _ExchangeRate = SqlFunc.MappingColumn(t1.SN, "CONVERT(decimal,CASE ISNULL(t1.ExchangeRate,'') WHEN '' THEN '0' ELSE t1.ExchangeRate END)"),
                            _Advance = SqlFunc.MappingColumn(t1.SN, "CONVERT(decimal,REPLACE(t1.Advance,',',''))"),
                            _AmountSum = SqlFunc.MappingColumn(t1.SN, "CONVERT(decimal,REPLACE(t1.AmountSum,',',''))"),
                            _TaxSum = SqlFunc.MappingColumn(t1.SN, "CONVERT(decimal,REPLACE(t1.TaxSum,',',''))"),
                            _AmountTaxSum = SqlFunc.MappingColumn(t1.SN, "CONVERT(decimal,REPLACE(t1.AmountTaxSum,',',''))"),
                            _TotalReceivable = SqlFunc.MappingColumn(t1.SN, "CONVERT(decimal,REPLACE(t1.TotalReceivable,',',''))"),
                            //BillCheckDate = SqlFunc.MappingColumn(t1.BillCheckDate, "CONVERT(datetime,CASE ISNULL(BillCheckDate,'') WHEN '' THEN '0' ELSE BillCheckDate END)"),
                            //BillWriteOffDate = SqlFunc.MappingColumn(t1.BillCheckDate, "CONVERT(datetime,CASE ISNULL(BillWriteOffDate,'') WHEN '' THEN '0' ELSE BillWriteOffDate END)")

                            // 20180308 可能要額外判斷欄位是否為NULL或空值,不然會有轉換資料時會出錯
                            //_Advance = SqlFunc.MappingColumn(t1.SN, "Convert(decimal,case isnull(Advance,'') when '' then '0' else REPLACE(Advance,',','') end)"),
                            //_AmountSum = SqlFunc.MappingColumn(t1.SN, "Convert(decimal,case isnull(AmountSum,'') when '' then '0' else REPLACE(AmountSum,',','') end)"),
                            //_TaxSum = SqlFunc.MappingColumn(t1.SN, "Convert(decimal,case isnull(TaxSum,'') when '' then '0' else REPLACE(TaxSum,',','') end)"),
                            //_AmountTaxSum = SqlFunc.MappingColumn(t1.SN, "Convert(decimal,case isnull(AmountTaxSum,'') when '' then '0' else REPLACE(AmountTaxSum,',','') end)"),
                            //_TotalReceivable = SqlFunc.MappingColumn(t1.SN, "Convert(decimal,case isnull(TotalReceivable,'') when '' then '0' else REPLACE(TotalReceivable,',','') end)")

                        })
                        .MergeTable()
                        .OrderBy(("_ExchangeRate,_Advance,_AmountSum,_TaxSum,_AmountTaxSum,_TotalReceivable".Contains(sSortField) ? "_" : "") + sSortField, sSortOrder)
                        .ToPageList(pml.PageIndex, bExcel ? 100000 : pml.PageSize, ref iPageCount);
                    pml.Total = iPageCount;

                    Dictionary<string, decimal> dicCurrencyInfo = new Dictionary<string, decimal>();

                    foreach (View_OPM_BillInfo billinfo in pml.DataList as List<View_OPM_BillInfo>)
                    {
                        billinfo._ExchangeRate = 0M;
                        /* 匯率抓取 */
                        if (billinfo.CreateDate != default(DateTime))
                        {
                            if (!string.IsNullOrEmpty(billinfo.Currency))
                            {
                                int iYear = SqlFunc.ToDate(billinfo.CreateDate).Year;
                                int iMonth = SqlFunc.ToDate(billinfo.CreateDate).Month;

                                string sKey = $"{ iYear }|{iMonth}|{billinfo.Currency}";

                                if (!dicCurrencyInfo.Keys.Contains(sKey))
                                {
                                    var data = db.Queryable<OTB_SYS_Currency>()
                                                 .Single(p => p.OrgID == billinfo.OrgID &&
                                                              p.year == iYear &&
                                                              p.month == iMonth &&
                                                              p.currency == billinfo.Currency);

                                    if (data != null)
                                    {
                                        dicCurrencyInfo.Add(sKey, data.exchange_rate);
                                    }
                                    else
                                    {
                                        continue;
                                    }
                                }

                                billinfo.ExchangeRate = dicCurrencyInfo[sKey].ToString("#0.##");
                                billinfo._ExchangeRate = dicCurrencyInfo[sKey];

                            }
                        }
                    }

                    rm = new SuccessResponseMessage(null, i_crm);
                    if (bExcel)
                    {
                        var AllCBMUsage = CommonRPT.GetAllCBMUsages(db, i_crm.ORIGID);
                        #region 設定幣別名稱
                        var CurrencyName = CommonRPT.GetCurrencyUnit(i_crm.ORIGID);
                        var RoundingPoint = CommonRPT.GetRoundingPoint(i_crm.ORIGID);
                        var DollorFormated = "N" + RoundingPoint.ToString();
                        #endregion
                        var sFileName = "";
                        var oHeader = new Dictionary<string, string>();
                        var listMerge = new List<Dictionary<string, int>>();
                        var dicAlain = new Dictionary<string, string>();
                        var saBillInfo = pml.DataList as List<View_OPM_BillInfo>;
                        var dt_new = saBillInfo.ListToDataTable<View_OPM_BillInfo>();
                        var saBillPrepayFee = Common.GetSystemSetting(db, i_crm.ORIGID, "PrepayForCustomerCode");
                        var BillPrepayFeeList = saBillPrepayFee.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
                        var saActualPrepayFee = Common.GetSystemSetting(db, i_crm.ORIGID, "ActualPrepayForCustomerCode");
                        var ActualPrepayFeeList = saActualPrepayFee.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
                        switch (sExcelType)
                        {
                            case "BillList":
                                sFileName = "帳單狀態查詢資料";
                                oHeader = new Dictionary<string, string>
                                                {
                                                    { "RowIndex", "項次" },
                                                    { "BillNO", "帳單號碼" },
                                                    { "ExhibitioName", "展覽/活動名稱" },
                                                    { "PayerName", "付款人" },
                                                    { "ResponsiblePersonName", "負責業務" },
                                                    { "Currency", "幣別代號" },
                                                    //{ "ExchangeRate", "匯率" },
                                                    { "Advance", "預收金額(A)" },
                                                    { "AmountSum", "未稅金額(B)" },
                                                    { "TaxSum", "稅金(C)" },
                                                    { "AmountTaxSum", "含稅金額(D)=B+C" },
                                                    { "TotalReceivable", "總應收D-A" },
                                                    { "ExchangeRate", "匯率(會計用)(E)" },
                                                    { "UntaxAmountMutiRate", $"未稅金額({CurrencyName})(B*E)" }, //new
                                                    { "BillReimburseAmount", $"帳單代墊款({CurrencyName})" },
                                                    { "CreateUserName", "創建人員" },
                                                    { "BillCreateDate", "帳單創建時間" },
                                                    { "AuditVal", "帳單狀態" }
                                                };
                                dt_new.Columns.Add("UntaxAmountMutiRate");
                                dt_new.Columns.Add("BillReimburseAmount");
                                double UntaxAmountMutiRateTotalByLocalCurrency = 0;
                                decimal BillReimburseAmountTotalByLocalCurrency = 0;

                                foreach (DataRow row in dt_new.Rows)
                                {
                                    double.TryParse(row["ExchangeRate"].ToString(), out var dExchangeRate);
                                    double.TryParse(row["AmountSum"].ToString(), out var dAmountSum);

                                    row["Advance"] = row["Advance"].ToString() == "" ? "0" : $"{Convert.ToDouble(row["Advance"].ToString()):N2}";
                                    row["AmountSum"] = row["AmountSum"].ToString() == "" ? "0" : $"{dAmountSum:N2}";
                                    row["TaxSum"] = row["TaxSum"].ToString() == "" ? "0" : $"{Convert.ToDouble(row["TaxSum"].ToString()):N2}";
                                    row["AmountTaxSum"] = row["AmountTaxSum"].ToString() == "" ? "0" : $"{Convert.ToDouble(row["AmountTaxSum"].ToString()):N2}";
                                    row["TotalReceivable"] = row["TotalReceivable"].ToString() == "" ? "0" : $"{Convert.ToDouble(row["TotalReceivable"].ToString()):N2}";
                                    row["BillCreateDate"] = Convert.ToDateTime(row["BillCreateDate"].ToString()).ToString("yyyy/MM/dd HH:mm");
                                    //換算匯率

                                    //帳單代墊款(NTD)
                                    var BillFeeItemList = CommonRPT.ToFeeItems(row["FeeItems"].ObjToString());
                                    var BillReimburseAmount = BillFeeItemList.Where(c => BillPrepayFeeList.Contains(c.FinancialCode)).Sum(c => c.TWAmount); //帳單內特定費用代碼資料
                                    var BillReimburseAmountLocalCurrency = Rounding(BillReimburseAmount * dExchangeRate.ObjToDecimal(), RoundingPoint);
                                    row["BillReimburseAmount"] = $"{BillReimburseAmountLocalCurrency:N2}";
                                    BillReimburseAmountTotalByLocalCurrency += BillReimburseAmountLocalCurrency;
                                    //未稅金額(NTD)
                                    var UntaxAmountSubtotalLocalCurrency = Rounding(dAmountSum * dExchangeRate, RoundingPoint);
                                    row["UntaxAmountMutiRate"] = $"{UntaxAmountSubtotalLocalCurrency:N2}";
                                    UntaxAmountMutiRateTotalByLocalCurrency += UntaxAmountSubtotalLocalCurrency;
                                    var sBill_Status = "";
                                    switch (row["AuditVal"].ToString())
                                    {
                                        case "0"://未提交審核
                                            sBill_Status = "未提交審核";
                                            break;

                                        case "1"://提交審核中
                                            sBill_Status = "提交審核中";
                                            break;

                                        case "2"://已審核
                                            sBill_Status = "已審核";
                                            break;

                                        case "3"://不通過
                                            sBill_Status = "不通過";
                                            break;

                                        case "4"://已銷帳
                                            sBill_Status = "已銷帳";
                                            break;

                                        case "5"://已過帳
                                            sBill_Status = "已過帳";
                                            break;

                                        case "6"://已作廢
                                            sBill_Status = "已作廢";
                                            break;

                                        case "7"://抽單中
                                            sBill_Status = "抽單中";
                                            break;

                                        default:
                                            break;
                                    }
                                    row["AuditVal"] = sBill_Status;
                                }
                                var rowLast1 = dt_new.NewRow();
                                rowLast1["ExchangeRate"] = "總計" + CurrencyName;
                                rowLast1["UntaxAmountMutiRate"] = $"{UntaxAmountMutiRateTotalByLocalCurrency:N2}";
                                rowLast1["BillReimburseAmount"] = $"{BillReimburseAmountTotalByLocalCurrency:N2}";
                                dt_new.Rows.Add(rowLast1);
                                dicAlain = ExcelService.GetExportAlain(oHeader, "RowIndex", "ExchangeRate,Advance,AmountSum,TaxSum,TotalReceivable,AmountTaxSum,UntaxAmountMutiRate,BillReimburseAmount");
                                break;

                            case "BillAndPrice":
                                sFileName = "帳單成本金額";
                                #region 檢查幣別設定
                                var EmptyECurrency = saBillInfo.Where(c => string.IsNullOrWhiteSpace(c.Currency)).Select(c => c.BillNO).Distinct().ToList();
                                var EmptyExchangeRates = saBillInfo.Where(c => string.IsNullOrWhiteSpace(c.ExchangeRate)).Select(c => c.BillNO).Distinct().ToList();

                                if (EmptyECurrency.Any() || EmptyExchangeRates.Any())
                                {
                                    string ErrorMsg = string.Empty;
                                    if (EmptyECurrency.Any())
                                        ErrorMsg += $"帳單:{ string.Join(",", EmptyECurrency)}幣別為空。";
                                    if (EmptyExchangeRates.Any())
                                        ErrorMsg += $"帳單:{ string.Join(",", EmptyExchangeRates)}匯率為空。";
                                    if (i_crm.LANG == @"zh")
                                        ErrorMsg = ErrorMsg = ChineseStringUtility.ToSimplified(ErrorMsg);
                                    return new ErrorResponseMessage(ErrorMsg, i_crm);
                                }
                                #endregion

                                oHeader = new Dictionary<string, string>
                                            {
                                                { "RowIndex", "項次" },
                                                { "ExhibitioName", "展覽/活動名稱" },
                                                { "PayerName", "付款人" },
                                                { "BillNO", "帳單號碼" },
                                                { "AmountSum", $"未稅金額({CurrencyName})" },
                                                { "BillReimburseAmount", $"帳單代墊款({CurrencyName})" },
                                                { "ActualCost", $"實際成本({CurrencyName})" },
                                                { "ActualBillReimburseAmount", $"實際代墊款({CurrencyName})" },
                                                { "Number", "件數" },
                                                { "Weight", "重量" },
                                                { "Volume", "材積(CBM)" },
                                                { "TransportationMode", "運送方式" },
                                                { "IsRetn", "是否退運" }
                                            };
                                dt_new.Columns.Add("BillReimburseAmount");
                                dt_new.Columns.Add("ActualBillReimburseAmount");
                                dt_new.Columns.Add("ActualCost");
                                dt_new.Columns.Add("TransportationMode");
                                Double iTotalAmountSum = 0;
                                Double iTotalActualCost = 0;
                                Double iTotalBillReimburseAmount = 0;
                                Double iTotalActualBillReimburseAmount = 0;

                                foreach (DataRow row in dt_new.Rows)
                                {
                                    var ActualCostFeeItemJson = "";
                                    var sActualCost = "";
                                    var sTransportationMode = "";
                                    var _sBillNO = row["BillNO"].ToString();
                                    var sId = row["ParentId"].ToString();
                                    var sOrgId = row["OrgID"].ToString();
                                    var BillParentId = row[View_OPM_BillInfo.CN_PARENTID].ObjToString();
                                    var sIsRetn = row["IsRetn"].ToString();
                                    var sReFlow = row["ReFlow"].ToString();
                                    var sBillType = row["BillType"].ToString();
                                    var ThisBillCBMUsage = AllCBMUsage.Where(t1 => t1.ParentID == BillParentId && t1.IsReturn == sIsRetn).ToList();

                                    CommonRPT.CalcuCostAndProfit(db, ref ActualCostFeeItemJson, ref sActualCost, ref sTransportationMode, _sBillNO, sId, sIsRetn, sReFlow, sBillType);
                                    if (!string.IsNullOrEmpty(sTransportationMode))
                                    {
                                        var oArgument = db.Queryable<OTB_SYS_Arguments>().Single(it => it.OrgID == sOrgId && it.ArgumentClassID == "Transport" && it.ArgumentID == sTransportationMode);
                                        if (oArgument == null)
                                        {
                                            oArgument = new OTB_SYS_Arguments();
                                        }
                                        row["TransportationMode"] = oArgument.ArgumentValue ?? "";
                                    }
                                    row["IsRetn"] = sIsRetn == "Y" ? "是" : "否";
                                    var ActualCostFeeItemList = CommonRPT.ToFeeItems(ActualCostFeeItemJson);
                                    //實際成本(成本 + 代墊款 ): (整票貨總成本/整票貨CBM)*單家廠商CBM
                                    var SharedActualCost = CommonRPT.GetShareCost(ActualCostFeeItemList, ThisBillCBMUsage, _sBillNO);
                                    SharedActualCost = Rounding(SharedActualCost, RoundingPoint);
                                    row["ActualCost"] = $"{SharedActualCost:N2}";
                                    iTotalActualCost += SharedActualCost.ObjToMoney();

                                    //帳單代墊款 BillReimburseAmount ==> bill裡面的
                                    var BillFeeItemList = CommonRPT.ToFeeItems(row["FeeItems"].ObjToString());
                                    var BillReimburseAmount = BillFeeItemList.Where(c => BillPrepayFeeList.Contains(c.FinancialCode)).Sum(c => c.TWAmount); //帳單內特定費用代碼資料
                                    BillReimburseAmount = Rounding(BillReimburseAmount, RoundingPoint);
                                    row["BillReimburseAmount"] = BillReimburseAmount;
                                    iTotalBillReimburseAmount += BillReimburseAmount.ObjToMoney();

                                    //實際代墊款(NT$)  ==> 成本裡面的
                                    var ActualBillReimburseAmount = CommonRPT.GetShareCost(ActualCostFeeItemList, ThisBillCBMUsage, _sBillNO, ActualPrepayFeeList);//抓實際成本的資料
                                    ActualBillReimburseAmount = Rounding(ActualBillReimburseAmount, RoundingPoint);
                                    row["ActualBillReimburseAmount"] = ActualBillReimburseAmount;
                                    iTotalActualBillReimburseAmount += ActualBillReimburseAmount.ObjToMoney();

                                    #region ConvertToTWD 僅只有Receivable
                                    double RowExchangeRate = 0;
                                    double AmountSum = 0;
                                    double.TryParse(row["ExchangeRate"].ToString(), out RowExchangeRate);
                                    double.TryParse(row["AmountSum"].ToString(), out AmountSum);

                                    double MultipliedAmountSum = Math.Round(AmountSum * RowExchangeRate, MidpointRounding.AwayFromZero);
                                    row["AmountSum"] = MultipliedAmountSum.ToString();
                                    iTotalAmountSum += MultipliedAmountSum;
                                    #endregion
                                }

                                var rowLast = dt_new.NewRow();
                                rowLast["RowIndex"] = dt_new.Rows.Count + 1;
                                rowLast["ExhibitioName"] = "";
                                rowLast["PayerName"] = "";
                                rowLast["BillNO"] = "總計" + CurrencyName;
                                rowLast["AmountSum"] = $"{iTotalAmountSum:N2}";
                                rowLast["ActualCost"] = $"{iTotalActualCost:N2}";
                                rowLast["BillReimburseAmount"] = $"{iTotalBillReimburseAmount:N2}";
                                rowLast["ActualBillReimburseAmount"] = $"{iTotalActualBillReimburseAmount:N2}";
                                rowLast["Number"] = "";
                                rowLast["Weight"] = "";
                                rowLast["Volume"] = "";
                                rowLast["TransportationMode"] = "";
                                rowLast["IsRetn"] = "";
                                dt_new.Rows.Add(rowLast);

                                dicAlain = ExcelService.GetExportAlain(oHeader, "RowIndex,IsRetn", "ActualCost,AmountSum,ActualBillReimburseAmount,BillReimburseAmount,Weight,Volume");

                                break;

                            default:
                                {
                                    break;
                                }
                        }
                        var bOk = new ExcelService().CreateExcelByTb(dt_new, out string sPath, oHeader, dicAlain, listMerge, sFileName);
                        if (bOk)
                        {
                            var hightLight = Color.FromArgb(226, 240, 217);
                            HightLightColumn(sExcelType, sPath, hightLight);
                        }

                        rm.DATA.Add(BLWording.REL, sPath);
                    }
                    else
                    {
                        rm.DATA.Add(BLWording.REL, pml);
                    }
                } while (false);
            }
            catch (Exception ex)
            {
                sMsg = Util.GetLastExceptionMsg(ex);
                LogAndSendEmail(sMsg + "Params:" + JsonToString(i_crm), ex, i_crm.ORIGID, i_crm.USERID, nameof(BillStatus_QryService), "", "QueryPage(賬單狀態(分頁查詢))", "", "", "");
            }
            finally
            {
                if (null != sMsg)
                {
                    rm = new ErrorResponseMessage(sMsg, i_crm);
                }
            }
            return rm;
        }

        #endregion 賬單狀態(分頁查詢)

        public OVW_OPM_BillInfo GetBillInfoByRow(DataRow row, string isRetun)
        {
            var sAuditVal = row["AuditVal"] == null ? "" : row["AuditVal"].ToString();
            var sVolume = row["Volume"] == null ? "0" : row["Volume"].ToString();
            OVW_OPM_BillInfo _BillInfo = new OVW_OPM_BillInfo()
            {
                OrgID = row["OrgID"].ToString(),
                ParentId = row["ParentId"].ToString(),
                IsRetn = isRetun,
                AuditVal = sAuditVal,
                Volume = sVolume
            };
            return _BillInfo;
        }

        public decimal Rounding(decimal value, int digit = 0)
        {
            if (digit <= 0)
                return Math.Round(value, MidpointRounding.AwayFromZero);
            else
                return Math.Round(value, digit, MidpointRounding.AwayFromZero);
        }
        public double Rounding(double value, int digit = 0)
        {
            if (digit <= 0)
                return Math.Round(value, MidpointRounding.AwayFromZero);
            else
                return Math.Round(value, digit, MidpointRounding.AwayFromZero);
        }

        public void HightLightColumn(string Type, string ExcelPath, Color color)
        {
            if (Type == "BillList")
            {
                var cellsApp = new ExcelService(ExcelPath);
                var cells = cellsApp.sheet.Cells;//单元格
                var StartColumnIndex = 11;
                var EndColumnIndex = StartColumnIndex + 3;
                var StartRowIndex = 3;
                var EndRowIndex = cells.Rows.Count;
                for (int row = StartRowIndex; row < EndRowIndex; row++)
                {
                    for (int col = StartColumnIndex; col < EndColumnIndex; col++)
                    {
                        var Style = cells[row, col].GetStyle();
                        Style.ForegroundColor = color;
                        //Style.BackgroundColor = color;
                        cells[row, col].SetStyle(Style);
                    }
                }
                cellsApp.workbook.Save(ExcelPath);
            }

        }

    }
}