From 4095e25997f270021474adfbcb16804cf56890a3 Mon Sep 17 00:00:00 2001 From: tangyunhao <3122282384@qq.com> Date: Fri, 18 Apr 2025 18:30:12 +0800 Subject: [PATCH] =?UTF-8?q?#TRS-ZS-263=20=E7=AE=A1=E7=90=86=E7=AB=AF-?= =?UTF-8?q?=E5=AF=BC=E5=85=A5=E8=B4=B9=E7=8E=87=E6=97=B6=EF=BC=8C=E4=B8=B4?= =?UTF-8?q?=E6=97=B6=E8=B4=B9=E7=8E=87=E5=A1=AB=E4=BA=86=E5=8D=95=E4=BD=8D?= =?UTF-8?q?=EF=BC=8C=E5=9F=BA=E7=A1=80=E8=B4=B9=E7=8E=87=E6=B2=A1=E6=9C=89?= =?UTF-8?q?=E5=A1=AB=E5=8D=95=E4=BD=8D=EF=BC=8C=E5=AF=BC=E5=85=A5=E7=9A=84?= =?UTF-8?q?=E5=9F=BA=E7=A1=80=E8=B4=B9=E7=8E=87=E5=BA=94=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E7=BB=9D=E5=AF=B9=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Modules/SwapModule/SwapRateService.cs | 50 +++++++++++++----- .../App_Docs/导入模板/阶梯费率导入模板.xlsx | Bin 8844 -> 10340 bytes 2 files changed, 36 insertions(+), 14 deletions(-) diff --git a/YLErpDAL/Modules/SwapModule/SwapRateService.cs b/YLErpDAL/Modules/SwapModule/SwapRateService.cs index 26184c06..3b6ac440 100644 --- a/YLErpDAL/Modules/SwapModule/SwapRateService.cs +++ b/YLErpDAL/Modules/SwapModule/SwapRateService.cs @@ -107,8 +107,8 @@ namespace YLErp.Modules.SwapModule swapRate.DiscountRateIsPercent = req.DiscountRateIsPercent; swapRate.DiscountRate = req.DiscountRate; swapRate.FrontDeskCharge = req.FrontDeskCharge; - swapRate.FrontDeskChargeIsPercent=req.FrontDeskChargeIsPercent; - swapRate.BackDeskCharge=req.BackDeskCharge; + swapRate.FrontDeskChargeIsPercent = req.FrontDeskChargeIsPercent; + swapRate.BackDeskCharge = req.BackDeskCharge; swapRate.BackDeskChargeIsPercent = req.BackDeskChargeIsPercent; swapRate.SetOpt(UserId, UserName); } @@ -227,34 +227,55 @@ namespace YLErp.Modules.SwapModule var tempRate = reader.GetString("临时费率"); if (!string.IsNullOrEmpty(tempRate)) { + decimal rate = 0; if (tempRate.EndsWith("%")) { swapRate.TempRateIsPercent = true; tempRate = tempRate.Replace("%", ""); + decimal.TryParse(tempRate, out rate); + rate = rate / 100; + } + else + { + swapRate.TempRateIsPercent = false; + decimal.TryParse(tempRate, out rate); } - decimal.TryParse(tempRate, out var rate); swapRate.TempRate = rate; } var baseRate = reader.GetString("基础费率"); if (!string.IsNullOrEmpty(baseRate)) { + decimal rate = 0; if (baseRate.EndsWith("%")) { swapRate.BaseRateIsPercent = true; baseRate = baseRate.Replace("%", ""); + decimal.TryParse(baseRate, out rate); + rate = rate / 100; + } + else + { + swapRate.BaseRateIsPercent = false; + decimal.TryParse(baseRate, out rate); } - decimal.TryParse(baseRate, out var rate); swapRate.BaseRate = rate; } var disAccRate = reader.GetString("优惠费率"); if (!string.IsNullOrEmpty(disAccRate)) { + decimal rate = 0; if (disAccRate.EndsWith("%")) { swapRate.DiscountRateIsPercent = true; disAccRate = disAccRate.Replace("%", ""); + decimal.TryParse(disAccRate, out rate); + rate = rate / 100; + } + else + { + swapRate.DiscountRateIsPercent = false; + decimal.TryParse(disAccRate, out rate); } - decimal.TryParse(disAccRate, out var rate); swapRate.DiscountRate = rate; } var frontRate = reader.GetString("现券对冲交易费用"); @@ -265,7 +286,8 @@ namespace YLErp.Modules.SwapModule swapRate.FrontDeskChargeIsPercent = true; frontRate = frontRate.Replace("‱", ""); } - decimal.TryParse(frontRate, out var rate); + + decimal.TryParse(frontRate, out var rate); swapRate.FrontDeskCharge = rate * 0.0001m; } var backRate = reader.GetString("现券对冲结算费用"); @@ -277,7 +299,7 @@ namespace YLErp.Modules.SwapModule backRate = backRate.Replace("‱", ""); } decimal.TryParse(backRate, out var rate); - swapRate.BackDeskCharge = rate*0.0001m; + swapRate.BackDeskCharge = rate * 0.0001m; } swapRate.DiscountAccDown = reader.GetDecimal("优惠累计量下限"); ValidateSwapRate(swapRate); @@ -321,7 +343,7 @@ namespace YLErp.Modules.SwapModule exportModel.TempRate = item.TempRateIsPercent ? item.TempRate.OtcFormatPercent(4) : item.TempRate.OtcFormatMoney(true); exportModel.DiscountRate = item.DiscountRateIsPercent ? item.DiscountRate.OtcFormatPercent(4) : item.DiscountRate.OtcFormatMoney(true); exportModel.DiscountAccDown = item.DiscountAccDown.OtcFormatMoney(true); - exportModel.FrontDeskCharge= item.FrontDeskChargeIsPercent==true ? item.FrontDeskCharge.OtcFormatTenThousandsPercent(4) : item.FrontDeskCharge.OtcFormatMoney(true); + exportModel.FrontDeskCharge = item.FrontDeskChargeIsPercent == true ? item.FrontDeskCharge.OtcFormatTenThousandsPercent(4) : item.FrontDeskCharge.OtcFormatMoney(true); exportModel.BackDeskCharge = item.BackDeskChargeIsPercent == true ? item.BackDeskCharge.OtcFormatTenThousandsPercent(4) : item.BackDeskCharge.OtcFormatMoney(true); list.Add(exportModel); } @@ -363,11 +385,11 @@ namespace YLErp.Modules.SwapModule var posiNotionalValueGroup = DbContext.trade.Where(x => x.TradeDate >= monthStart && x.ValidState != ConsGlobal.InValid && x.TradeType == "收益互换" - && ConsTrade.TradeStatusCustomexport.Contains(x.TradeStatus)).ToList().GroupBy(x=>x.ClientId); + && ConsTrade.TradeStatusCustomexport.Contains(x.TradeStatus)).ToList().GroupBy(x => x.ClientId); foreach (var swapRate in swapRates) { - var clientPosiNotional = posiNotionalValueGroup.FirstOrDefault(x=>x.Key== swapRate.ClientId).ToList().Sum(s=>s.OriginalStockEqvNotional??0); - SendToKafka(swapRate, clientPosiNotional); + var clientPosiNotional = posiNotionalValueGroup.FirstOrDefault(x => x.Key == swapRate.ClientId).ToList().Sum(s => s.OriginalStockEqvNotional ?? 0); + SendToKafka(swapRate, clientPosiNotional); } } /// @@ -398,13 +420,13 @@ namespace YLErp.Modules.SwapModule swapRateKafkaModel.isRate = swapRate.BaseRateIsPercent; swapRateKafkaModel.rate = swapRate.BaseRate ?? 0; swapRateKafkaModel.disRateDown = swapRate.DiscountAccDown ?? 0; - if (swapRate.DiscountAccDown.HasValue&&Convert.ToDecimal(clientPosiNotional)>= swapRateKafkaModel.disRateDown) + if (swapRate.DiscountAccDown.HasValue && Convert.ToDecimal(clientPosiNotional) >= swapRateKafkaModel.disRateDown) { swapRateKafkaModel.isDisRate = swapRate.DiscountRateIsPercent; - swapRateKafkaModel.disRate= swapRate.DiscountRate ?? 0; + swapRateKafkaModel.disRate = swapRate.DiscountRate ?? 0; swapRateKafkaModel.rate = swapRateKafkaModel.disRate; } - + } kafkaProduceHelper.Produce(Environment.GetEnvironmentVariable("KafkaConfig_ClientRateTopic"), JsonConvert.SerializeObject(swapRateKafkaModel)); } diff --git a/YLErpWeb/App_Docs/导入模板/阶梯费率导入模板.xlsx b/YLErpWeb/App_Docs/导入模板/阶梯费率导入模板.xlsx index d7ffdcecc732ceac13587bb2dfa513b071564530..fd6df59c07ac8097b6cb2738fd229bb90493f944 100644 GIT binary patch literal 10340 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 literal 8844 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