From 8e61f23e18e5ca54c711ffbd6c49efeb4523092c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E6=96=B9=E6=B5=B7?= Date: Wed, 16 Apr 2025 15:15:59 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=9D=E8=AF=81=E9=87=91=E7=AE=97=E6=B3=95&?= =?UTF-8?q?=E8=B5=84=E9=87=91=E8=AE=A1=E7=AE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DBModels/ClientCashInCashOut.cs | 6 + .../YLErp.Core/DBModels/Clientbalancedaily.cs | 21 ++ .../YLErp.Core/DBModels/Enums/CashTypeEnum.cs | 14 + .../YLErp.Core/DBModels/client_marginrate.cs | 5 +- .../YLErp.Core/Models/ClientSettleBalance.cs | 85 +++-- .../BLL/EodSettlement/ClientBalanceUtility.cs | 62 ++- .../RealTimeClientBanlanceService.cs | 114 ++++-- YLErpDAL/BLL/EodSettlement/RealtimePnlCalc.cs | 12 +- YLErpDAL/Model/ClientCashInCashOut.cs | 5 + YLErpDAL/Model/clientLinq.cs | 28 +- .../ClientCashInCashOutDataService.cs | 27 +- YLErpDAL/Modules/ClientModule/EntryexitBLL.cs | 3 +- .../EodPriceQueryService.cs | 12 + .../EodCheckMonitoredTrade.cs | 60 +-- .../SettlementModule/EodCheckSwapFlow.cs | 31 ++ .../SettlementModule/EodClientBalanceCalc.cs | 179 +++------ .../SettlementModule/EodTaskRunner.cs | 198 +--------- .../MarginModule/MarginRateSwapService.cs | 9 +- .../SettlementReportModule/FundReportModel.cs | 59 +++ .../SettlementReportFotShanXiService.cs | 24 +- .../Modules/RiskModule/QuotaMonitorService.cs | 88 +++-- .../SwapModule/SwapEodPositionService.cs | 30 +- .../SwapModule/SwapTradeAutoService.cs | 2 +- .../Modules/SwapModule/SwapTradeService.cs | 56 +-- YLErpWeb/App_Data/FunctionRight.xml | 17 - YLErpWeb/App_Data/Menus.txt | 6 - .../导入模板/互换预付金率导入模板.xlsx | Bin 9787 -> 9767 bytes YLErpWeb/App_Docs/导出模板/结算报告模板.xlsx | Bin 38992 -> 19507 bytes .../App_Docs/导出模板/结算报告模板_浙商.xlsx | Bin 19538 -> 0 bytes YLErpWeb/App_Docs/导出模板/资金监控模板1.xlsx | Bin 12469 -> 11348 bytes .../Controllers/MarginRateSwapController.cs | 1 + YLErpWeb/Controllers/clientController.cs | 84 +---- YLErpWeb/Hubs/SwapFlowCombookingHub.cs | 2 +- .../MarginRateSwap/MarginRateSwapEdit.cshtml | 11 +- .../ClientBalanceReportWildcard.cshtml | 56 +-- .../client/clientRiskMonitorBatchSend.cshtml | 6 + .../TradeMarketClientSend.cshtml | 2 +- .../clientbalance/TradeMarketDescSet.cshtml | 2 +- .../clientbalance/TradeMarketReport.cshtml | 353 +++--------------- YLErpWeb/Views/entryexit/entryexitEdit.cshtml | 19 +- YLErpWeb/Views/entryexit/entryexitList.cshtml | 6 + YLErpWeb/Views/entryexit/entryexitView.cshtml | 1 + YLErpWeb/YLErpWeb.csproj | 4 +- .../Scripts/app/client/clientRiskMonitor.js | 78 +--- .../Scripts/app/client/entryexitEdit.js | 2 - .../Scripts/app/client/tradeMarketReport.js | 103 +---- .../app/marginRate/marginRateSwapList.js | 6 +- 47 files changed, 695 insertions(+), 1194 deletions(-) create mode 100644 Framework/YLErp.Core/DBModels/Enums/CashTypeEnum.cs create mode 100644 YLErpDAL/Modules/EodModule/SettlementModule/EodCheckSwapFlow.cs delete mode 100644 YLErpWeb/App_Docs/导出模板/结算报告模板_浙商.xlsx diff --git a/Framework/YLErp.Core/DBModels/ClientCashInCashOut.cs b/Framework/YLErp.Core/DBModels/ClientCashInCashOut.cs index 6e308224..93f0bc8b 100644 --- a/Framework/YLErp.Core/DBModels/ClientCashInCashOut.cs +++ b/Framework/YLErp.Core/DBModels/ClientCashInCashOut.cs @@ -199,6 +199,12 @@ namespace YLErp.DBModels /// 审批时间 /// public DateTime? ApprovalDate { get; set; } + + /// + /// 资金类型初保账户/追保账户 + /// + [DisplayName("账户类型")] + public string cash_type { get; set; } } /// /// 出入金信息 diff --git a/Framework/YLErp.Core/DBModels/Clientbalancedaily.cs b/Framework/YLErp.Core/DBModels/Clientbalancedaily.cs index e7b13242..6cb7fb61 100644 --- a/Framework/YLErp.Core/DBModels/Clientbalancedaily.cs +++ b/Framework/YLErp.Core/DBModels/Clientbalancedaily.cs @@ -530,6 +530,22 @@ namespace YLErp.DBModels /// 维保线 /// public double? MaintenanceLine { get; set; } + /// + /// 追保入金 + /// + public double? vm_in_fund { get; set; } + /// + /// 追保 入金累计 + /// + public double? vm_in_fund_sum { get; set; } + /// + /// 追保 出金 + /// + public double? vm_out_fund { get; set; } + /// + /// 追保 出金累计 + /// + public double? vm_out_fund_sum { get; set; } [NotMapped] public FundObject FundObject { get; set; } @@ -544,11 +560,13 @@ namespace YLErp.DBModels public class FundObject { public Dictionary InFund { get; set; } = new Dictionary(); + public Dictionary VmInFund { get; set; } = new Dictionary(); /// /// 出金为绝对值,不包含出金方向处理 /// public Dictionary OutFund { get; set; } = new Dictionary(); + public Dictionary VmOutFund { get; set; } = new Dictionary(); public Dictionary NetFund { get; set; } = new Dictionary(); @@ -559,8 +577,11 @@ namespace YLErp.DBModels public Dictionary OtherFund { get; set; } = new Dictionary(); public Dictionary InFundSum { get; set; } = new Dictionary(); + public Dictionary VmInFundSum { get; set; } = new Dictionary(); public Dictionary OutFundSum { get; set; } = new Dictionary(); + public Dictionary VmOutFundSum { get; set; } = new Dictionary(); + public Dictionary NetFundSum { get; set; } = new Dictionary(); diff --git a/Framework/YLErp.Core/DBModels/Enums/CashTypeEnum.cs b/Framework/YLErp.Core/DBModels/Enums/CashTypeEnum.cs new file mode 100644 index 00000000..04b3cbe7 --- /dev/null +++ b/Framework/YLErp.Core/DBModels/Enums/CashTypeEnum.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace YLErp.DBModels.Enums +{ + public enum CashTypeEnum + { + 初保账户, + 追保账户 + } +} diff --git a/Framework/YLErp.Core/DBModels/client_marginrate.cs b/Framework/YLErp.Core/DBModels/client_marginrate.cs index 4a8ecdba..586b834e 100644 --- a/Framework/YLErp.Core/DBModels/client_marginrate.cs +++ b/Framework/YLErp.Core/DBModels/client_marginrate.cs @@ -32,7 +32,7 @@ namespace YLErp.DBModels [DisplayName("生效日期")] public DateTime ValueDate { get; set; } - [DisplayName("初始预付金率")] + [DisplayName("初始保证金率")] public double InitMarginRate { get; set; } [DisplayName("平仓线")] @@ -61,6 +61,9 @@ namespace YLErp.DBModels /// 互换默认期限 /// public int? SwapEndDays { get; set; } + + [DisplayName("维持保证金率")] + public double MaintenanceRate { get; set; } public string GetDataTraceKeyInfo() { return "客户品种预付金率:" + ClientId + Type + VarietyId; diff --git a/Framework/YLErp.Core/Models/ClientSettleBalance.cs b/Framework/YLErp.Core/Models/ClientSettleBalance.cs index 079a8454..ec41df43 100644 --- a/Framework/YLErp.Core/Models/ClientSettleBalance.cs +++ b/Framework/YLErp.Core/Models/ClientSettleBalance.cs @@ -146,11 +146,39 @@ namespace YLErp.Models /// 当日入金 /// public double InFund { get; set; } + + public double VmInFund { get; set; } + /// + /// 总入金 + /// + public double InFundSum { get; set; } + + /// + /// 追保总入金 + /// + public double VmInFundSum { get; set; } + /// + ///追保账户金额 + /// + public double VmFundSum { get { return VmInFundSum-VmOutFundSum; } } + /// + /// 总出入金金额 + /// + public double NetFundAll { get { return NetFund+VmFundSum; } } /// /// 当日出金 /// 为绝对值,即不包含出金方向 /// public double OutFund { get; set; } + public double VmOutFund { get; set; } + /// + /// 总出金 + /// + public double OutFundSum { get; set; } + /// + /// 追保总出金 + /// + public double VmOutFundSum { get; set; } /// /// 票息 /// @@ -185,27 +213,6 @@ namespace YLErp.Models { get { - if (PS.Config.Is广期资本) - { - //期末结存 + 持仓盈亏-冻结+授信+质押市值 - var result = AmountFund + PositionPnl + AllFreezeBalance() + TotalCredit + GuaranteesTotalAmount; - if (SamePeer == 1) //非同业客户 -预付金占用 - { - result = result + PayableMargin; - } - return result; - } - - if (PS.Config.Is宏源) - { - var result = MarginBalance + PayableMargin - FrozenMarginMoney - GuaranteesTotalAmount; - return result; - } - if (PS.Config.Is广发商贸) - { - var result = MarginBalance + PayableMargin - FrozenMarginMoney - GuaranteesTotalAmount; - return result; - } return _AvailableAmount; } set @@ -388,7 +395,7 @@ namespace YLErp.Models public double TwoSideMargin { get; set; } /// - /// 本方角度预付金 + /// 初始保证金金额 /// public double MySideMargin { get; set; } @@ -1036,5 +1043,39 @@ namespace YLErp.Models /// 互换存续预付金 /// public double SwapMargin { get; set; } + + /// + /// 维持保证金 + /// + public double MaintenanceMargin { get; set; } + /// + /// 互换合并盯市金额B=现金结存+∑(组合待实现收益) + /// + public double SwapMarketAmount + { + get + { + return AmountFund + RoundedPositionPnl; + } + } + /// + /// 履约保证金比例:合并盯市价格/持仓名义本金 + /// + public decimal SwapMarketAmountPercent + { + get + { + if (PositionNotionalPrincipal == 0) + { + return 0; + } + var percent = (decimal)Math.Round(SwapMarketAmount / PositionNotionalPrincipal, 6, MidpointRounding.AwayFromZero); + return percent > 1 ? 1 : percent; + } + } + /// + /// 是否需要追保 + /// + public bool NeedAddMargin { get; set; } } } diff --git a/YLErpDAL/BLL/EodSettlement/ClientBalanceUtility.cs b/YLErpDAL/BLL/EodSettlement/ClientBalanceUtility.cs index c30cd72d..4e5fcd9f 100644 --- a/YLErpDAL/BLL/EodSettlement/ClientBalanceUtility.cs +++ b/YLErpDAL/BLL/EodSettlement/ClientBalanceUtility.cs @@ -1,6 +1,7 @@ using BaseOUDAL; using YLErp.BLL.Eod; using YLErp.DBModels.Enums; +using YLErp.Model; using YLErp.Models; using YLErp.Modules; using YLErp.Modules.ClientModule; @@ -110,7 +111,8 @@ namespace YLErp.BLL.EodSettlement var lastpushLog = db.push_log.Where(x => x.data_type == (int)SwapPushDataEnum.日终估值获取 && x.data_state == (int)SwapPushDataStateEnum.接收处理成功&&x.create_time> valuedate).OrderByDescending(o => o.create_time).FirstOrDefault(); //获取根据系统时间 var lastBalanceDate = EodOperationBase.GetLastSettlementDate(valuedate); - + // 获取定义文件预付金率设置 + var clientMarginTemplates = db.client_marginrate.Where(x => x.ValueDate <= endDate).OrderByDescending(o => o.ValueDate).AsNoTracking().ToList(); var lastDate = lastBalanceDate; //查询历史记录 @@ -248,6 +250,7 @@ namespace YLErp.BLL.EodSettlement TwoSideMargin = t.TwoSideMargin ?? 0.0, OtherSideMargin = t.OtherSideMargin ?? 0.0, MySideMargin = t.MySideMargin ?? 0.0, + MaintenanceMargin = cs.VariationMargin ?? 0.0, IsPayableMarginManual = t.IsPayableMarginManual, IsPayableMarginLock = cs == null ? false : cs.ModifiedFlag, FrozenMarginMoney = t.FrozenMarginMoney ?? 0.0, @@ -274,7 +277,11 @@ namespace YLErp.BLL.EodSettlement TdWinLoss = t.WinLoss, MarginJson = cs.PVJsons, MaintenanceLine = t.MaintenanceLine, - TotalNominal=t.TotalNominal + TotalNominal=t.TotalNominal, + InFundSum = t.InFundSum, + OutFundSum = t.OutFundSum, + VmInFundSum = t.vm_in_fund_sum, + VmOutFundSum = t.vm_out_fund_sum, }; var endDatas = endQuery.ToArray(); @@ -287,16 +294,12 @@ namespace YLErp.BLL.EodSettlement var lasttoDay = EodOperationBase.GetLastSettlementDate(lastDate, true); var lastClientBalanceDaily = db.ClientBalanceDaily.Where(a => a.BalanceDate == lasttoDay && a.ClientId == data.ClientId).FirstOrDefault(); - + var marginRate = GetClientMarginRate(data.ClientId, clientMarginTemplates); balance.FrozenBalance = data.FrozenBalance; balance.FreezePremium = data.FreezePremium; balance.ReceivablesPremium = data.ReceivablesPremium; balance.AmountFund = data.AmountFund; - balance.AvailableAmount = data.AvailableAmount; - //if (PS.Config.Is广期资本) - //{ - // balance.AvailableAmount = Math.Min(data.AvailableAmount1, data.AvailableAmount2); - //} + balance.TotalCredit = data.TotalCredit; balance.PayableMargin = data.PayableMargin; @@ -306,13 +309,13 @@ namespace YLErp.BLL.EodSettlement balance.RoundedDaliyPnl = data.RoundedPositionPnl - (lastClientBalanceDaily?.RoundedPositionPnl ?? 0); balance.PositionPnl = data.PositionPnl; balance.RoundedPositionPnl = data.RoundedPositionPnl; - balance.AvailableAmount = balance.AmountFund + balance.TotalCredit + balance.PayableMargin + balance.GuaranteesTotalAmount + balance.RoundedPositionPnl - balance.FrozenMarginMoney; balance.DeltaMargin = data.DeltaMargin; balance.SwapPayableMargin = data.SwapPayableMargin; balance.SwapUnMargin = data.SwapUnPayableMargin; balance.TwoSideMargin = data.TwoSideMargin; balance.OtherSideMargin = data.OtherSideMargin; balance.MySideMargin = data.MySideMargin; + balance.MaintenanceMargin=data.MaintenanceMargin; balance.IsPayableMarginManual = data.IsPayableMarginManual; balance.IsPayableMarginLock = data.IsPayableMarginLock; balance.FrozenMarginMoney = data.FrozenMarginMoney; @@ -341,8 +344,22 @@ namespace YLErp.BLL.EodSettlement balance.ClientName = client.Name; balance.MaintenanceLine = data.MaintenanceLine ?? 0; balance.PositionNotionalPrincipal = data.TotalNominal??0; - balance.DesirableFund = balance.AvailableAmount; - balance.MarginByPayableMarginTotal = 0; + + balance.OutFundSum = data.OutFundSum ?? 0; + balance.InFundSum = data.InFundSum ?? 0; + balance.VmInFundSum = data.VmInFundSum ?? 0; + balance.VmOutFundSum = data.VmOutFundSum ?? 0; + //预付金金额=期末结存-初始预付金金额 + balance.MarginBalance = balance.AmountFund - balance.MySideMargin; + // 可用资金 = 期末结存 - 追保账户余额 - 初始保证金 + balance.AvailableAmount = balance.MarginBalance - (balance.VmInFundSum - balance.VmOutFundSum); + // 是否追保=履约保证金比例<维持保证金率 + balance.NeedAddMargin = balance.SwapMarketAmountPercent < (decimal)marginRate.MaintenanceRate; + // 追保金额=初始保证金金额-盯市金额 + balance.MarginByPayableMarginTotal = balance.NeedAddMargin ? (balance.MySideMargin - balance.SwapMarketAmount):0; + // 可取资金=期末结存-min(持仓盈亏,0)-初始保证金 + balance.DesirableFund = balance.MarginBalance - Math.Min(balance.RoundedPositionPnl, 0); + } } } @@ -1391,6 +1408,29 @@ namespace YLErp.BLL.EodSettlement } return lastClientBalances; } + /// + /// 获取预付金率设置 + /// + /// + /// + /// + private static client_marginrate GetClientMarginRate(int clientId, List clientMarginTemplates) + { + var marinRate = clientMarginTemplates.Where(x => x.ClientId == clientId ).FirstOrDefault(); + if (marinRate == null) + { + marinRate = clientMarginTemplates.Where(x => x.ClientId == 0).FirstOrDefault(); + } + if (marinRate == null) + { + marinRate = new client_marginrate + { + InitMarginRate = 1, + MaintenanceRate = 1, + }; + } + return marinRate; + } class ClientBalanceEx : ClientSettleBalance { public string UnderlyingCode { get; set; } diff --git a/YLErpDAL/BLL/EodSettlement/RealTimeClientBanlanceService.cs b/YLErpDAL/BLL/EodSettlement/RealTimeClientBanlanceService.cs index fef0aa83..1ac1479b 100644 --- a/YLErpDAL/BLL/EodSettlement/RealTimeClientBanlanceService.cs +++ b/YLErpDAL/BLL/EodSettlement/RealTimeClientBanlanceService.cs @@ -11,6 +11,7 @@ using YLErp.Commons; using YLErp.DataBase; using YLErp.DBModels; using YLErp.DBModels.Enums; +using YLErp.Model; using YLErp.Model.Enum; using YLErp.Models; using YLErp.Modules; @@ -80,7 +81,7 @@ namespace YLErp.BLL.Eod var clientSpanQuery = from t in DbContext.client_span where t.ValueDate == calcDate && clientIds.Contains(t.ClientId) && t.SpanType == ClientSpan.SpanType_RealTime && t.WorstCastClientPayable != null - select new { t.ClientId, t.WorstCastClientPayable, t.DeltaMargin, t.SwapWorstCastClientPayable, t.TwoSideMargin, t.OtherSideMargin, t.MySideMargin, t.SwapUnMargin, t.PVJsons }; + select new { t.ClientId, t.WorstCastClientPayable, t.DeltaMargin, t.SwapWorstCastClientPayable, t.TwoSideMargin, t.OtherSideMargin, t.MySideMargin, t.SwapUnMargin, t.PVJsons, t.VariationMargin }; var clientSpanDic = clientSpanQuery.ToArray().Where(n => set.Add(n.ClientId)).ToDictionary(n => n.ClientId); @@ -140,6 +141,7 @@ namespace YLErp.BLL.Eod TwoSideMargin = clientSpan == null ? 0 : (clientSpan.TwoSideMargin ?? 0), OtherSideMargin = clientSpan == null ? 0 : (clientSpan.OtherSideMargin ?? 0), MySideMargin = clientSpan == null ? 0 : (clientSpan.MySideMargin ?? 0), + MaintenanceMargin = clientSpan == null ? 0 : (clientSpan.VariationMargin ?? 0), CreditCanApplySwap = client.creditCanApplySwap, TotalCreditStockEqvNotional = double.NaN, SettlementCurrency = client?.SettlementCurrency, @@ -164,7 +166,7 @@ namespace YLErp.BLL.Eod { var banlanceQuery = from t in DbContext.ClientBalanceDaily where t.BalanceDate == lastSettletDate && clientIds.Contains(t.ClientId) - select new { t.ClientId, t.ToDayRemainFund, t.TodayRemianFundProduct, t.PositionPremiumNetCash }; + select new { t.ClientId, t.ToDayRemainFund, t.TodayRemianFundProduct, t.PositionPremiumNetCash, t.RoundedPositionPnl, t.PayableMargin, t.MySideMargin, t.InFundSum, t.OutFundSum, t.vm_out_fund_sum, t.vm_in_fund_sum, t.OptionPremiumSwapSum, t.SwapBalance }; var banlanceDatas = banlanceQuery.ToArray(); foreach (var data in banlanceDatas) { @@ -176,6 +178,12 @@ namespace YLErp.BLL.Eod c.LastGuaranteesTotalAmount = data.TodayRemianFundProduct ?? 0; // 期初持仓交易净额 c.LastDayPositionPremiumNetCash = data.PositionPremiumNetCash ?? 0; + c.InFundSum = data.InFundSum ?? 0; + c.OutFundSum = data.OutFundSum ?? 0; + c.VmInFundSum = data.vm_in_fund_sum ?? 0; + c.VmOutFundSum = data.vm_out_fund_sum ?? 0; + c.OptionPremiumSwap = data.OptionPremiumSwapSum ?? 0; + c.SwapBalance = data.SwapBalance ?? 0; } } } @@ -226,7 +234,7 @@ namespace YLErp.BLL.Eod .ToDictionary(p => p.Key, p => p.OptDate); Dictionary dicCashInOut = DbContext.ClientCashInCashOut.Where(x => clientIds.Contains((int)x.ClientId)).AsEnumerable().GroupBy(p => (int)p.ClientId).Select(p => new { p.Key, OptDate = p.Max(d => d.OptDate) }).ToDictionary(p => p.Key, p => p.OptDate); - + var clientMarginTemplates = DbContext.client_marginrate.Where(x => x.ValueDate <= calcDate).OrderByDescending(o => o.ValueDate).AsNoTracking().ToList(); foreach (var item in _clientBalanceDic.Values) { #region 判断实时持仓数据是否最新(包含了最新交易操作的数据) @@ -241,25 +249,17 @@ namespace YLErp.BLL.Eod item.NetFund = item.InFund - item.OutFund; item.OtherFund = item.InFundOther + item.OutFundOther; + + item.InFundSum += item.InFund; + item.OutFundSum += item.OutFund; + item.VmInFundSum += item.VmInFund; + item.VmOutFundSum += item.VmOutFund; //上日资金余额 item.LastDayRemainFund = item.AmountFund; item.LastDayRemainFundWithProduct = item.LastDayRemainFund + item.LastGuaranteesTotalAmount; //当前账号资金 - item.AmountFund = item.AmountFund + item.NetFund + item.OtherFund + item.Coupon + item.OptionPremium + item.OptionPremiumSwap + item.SwapBalance + item.SettlementBalance; - - item.AvailableAmount = item.AmountFund + item.TotalCredit + item.PayableMargin + item.GuaranteesTotalAmount + item.RoundedPositionPnl - item.FrozenMarginMoney; - item.DesirableFund = item.AvailableAmount; - //预付金余额 - item.MarginBalance = item.AmountFund - item.FreezePremium - item.FrozenOutFund - item.FrozenRedeemFunds + - item.ReceivablesPremium + item.GuaranteesTotalAmount; - - //互换最大可用资金 - - item.CreditCanApplySwap = clientDic.ContainsKey(clientId) ? clientDic[clientId].creditCanApplySwap : false; - - //可取预付金为预付金余额 - 应缴预付金(上浮 + 0.02) - item.AdvisableMargin = Math.Max(item.MarginBalance + item.PayableMargin * marginMaxRation / marginRation, 0); + item.AmountFund = item.AmountFund + item.NetFund + item.OtherFund + item.OptionPremium + item.OptionPremiumSwap + item.SwapBalance + item.SettlementBalance; item.WinLoss += item.WinLoss2; @@ -269,19 +269,18 @@ namespace YLErp.BLL.Eod //可用名义本金规模 item.AvailableStockEqvNotional = item.TotalCreditStockEqvNotional - item.PositionNotionalPrincipal; - //客户方向取反 - item.RoundedPositionPnl *= -1; - item.PositionPnl *= -1; - item.DaliyPnl *= -1; - item.RoundedDaliyPnl *= -1; - item.RoundedPositionPv *= -1; - item.PositionPv *= -1; - item.SellPv *= -1; - item.DesirableRate = DataCacheProvider.GetClientDataSource().GetData(item.ClientId)?.DesirableRate ?? 0; - var clientAmount = item.AmountFund + item.TotalCredit + item.GuaranteesTotalAmount; - var clientSwapMarinAmount = clientAmount + item.SwapMargin; - var MaintenanceLine = clientSwapMarinAmount == 0 ? 0 : (clientAmount + item.PayableMargin) / clientSwapMarinAmount; - item.MaintenanceLine =Math.Round(MaintenanceLine, 2); + + var marginRate = GetClientMarginRate(item.ClientId, clientMarginTemplates); + //预付金金额=期末结存-初始预付金金额 + item.MarginBalance = item.AmountFund - item.MySideMargin; + // 可用资金 = 期末结存 - 追保账户余额 - 初始保证金 + item.AvailableAmount = item.MarginBalance - (item.VmInFundSum - item.VmOutFundSum) - item.FrozenMarginMoney; + // 是否追保=履约保证金比例<维持保证金率 + item.NeedAddMargin = item.SwapMarketAmountPercent < (decimal)marginRate.MaintenanceRate; + // 追保金额=初始保证金金额-盯市金额 + item.MarginByPayableMarginTotal = item.NeedAddMargin ? (item.MySideMargin - item.SwapMarketAmount) : 0; + // 可取资金=期末结存-min(持仓盈亏,0)-初始保证金 + item.DesirableFund = item.MarginBalance - Math.Min(item.RoundedPositionPnl, 0); } return _clientBalanceDic.Values; @@ -1082,18 +1081,20 @@ namespace YLErp.BLL.Eod ClientId = t.ClientId.Value, TradeId = t.TradeId ?? 0, action = t.Direction + "^" + (t.Direction == "应收" ? t.Action : ""), - money = t.Money.Value + money = t.Money.Value, + cash_type = t.cash_type }; //获取包含的所有收益互换id列表 var allTradeIds = ClientCashQuery.Select(x => x.TradeId).ToList(); var ClientCashQuerySum = from t in ClientCashQuery - group t by new { t.ClientId, t.action } into g + group t by new { t.ClientId, t.action, t.cash_type } into g select new { g.Key.ClientId, g.Key.action, + g.Key.cash_type, moneySum = g.Sum(n => n.money), swapMoneySun = 0.0 }; @@ -1127,13 +1128,28 @@ namespace YLErp.BLL.Eod balance.UnwindBalance = data.moneySum; } } - else if (data.action == "入金^") + if (data.action == "入金^") { - balance.InFund = data.moneySum; + if (data.cash_type == CashTypeEnum.初保账户.ToString()) + { + balance.InFund = data.moneySum; + } + else + { + balance.VmInFund = data.moneySum; + } + } else if (data.action == "出金^") { - balance.OutFund = data.moneySum; + if (data.cash_type == CashTypeEnum.初保账户.ToString()) + { + balance.OutFund = data.moneySum; + } + else + { + balance.VmOutFund = data.moneySum; + } } else if (data.action == "其他收入^") { @@ -1331,8 +1347,8 @@ namespace YLErp.BLL.Eod ClientId = item.client_id ?? 0, ClientName = item.client_name, TradingQty = (item.order_qty ?? 0) - (item.last_shares ?? 0), - TradingAmountAvg = item.full_price ?? 0, - TradingAmountFeeAvg = item.full_price ?? 0, + TradingAmountAvg = (item.full_price ?? 0)*0.01m, + TradingAmountFeeAvg = (item.full_price ?? 0) * 0.01m, TradingFee = 0 }; // clientOrder中数量单位为万 @@ -1457,6 +1473,30 @@ namespace YLErp.BLL.Eod return profit - releasedMargin; } + /// + /// 获取预付金率设置 + /// + /// + /// + /// + private static client_marginrate GetClientMarginRate(int clientId, List clientMarginTemplates) + { + var marinRate = clientMarginTemplates.Where(x => x.ClientId == clientId).FirstOrDefault(); + if (marinRate == null) + { + marinRate = clientMarginTemplates.Where(x => x.ClientId == 0).FirstOrDefault(); + } + if (marinRate == null) + { + marinRate = new client_marginrate + { + InitMarginRate = 1, + MaintenanceRate = 1, + }; + } + return marinRate; + } + public class ClientBalanceEx : ClientSettleBalance { public double InFundOther { get; set; } diff --git a/YLErpDAL/BLL/EodSettlement/RealtimePnlCalc.cs b/YLErpDAL/BLL/EodSettlement/RealtimePnlCalc.cs index d69b8843..887a8714 100644 --- a/YLErpDAL/BLL/EodSettlement/RealtimePnlCalc.cs +++ b/YLErpDAL/BLL/EodSettlement/RealtimePnlCalc.cs @@ -898,21 +898,21 @@ namespace YLErp.BLL.Eod /// private static void SetClientPositionPrice(ClientPosition clientPosition) { - if (clientPosition.position_qty <= 0 || _yLCache == null) + if (clientPosition.position_qty <= 0) { return; } try { //TRS-BondDepthMarket:160010.IB-0 - BondMarket bondMarket = _yLCache.StringGetWithNoPrefix("TRS-BondNowPrice:" + clientPosition.security_id + "-" + clientPosition.side); - if (bondMarket != null) + var bondPrice = EodPriceQueryService.GetChinaBondPrice(valuedateBLL.ValueDate, clientPosition.security_id); + if (bondPrice != null) { - clientPosition.price_now = bondMarket.netPrice; - clientPosition.full_price_now = bondMarket.fullPrice; - clientPosition.yield_now = bondMarket.mdEntryPx; + clientPosition.full_price_now = bondPrice.dirty_price_close; clientPosition.swap_market_value = clientPosition.full_price_now * clientPosition.position_qty * 10000 * (clientPosition.side == 0 ? 1 : -1) * ConsGlobal.bondPriceMultiple; clientPosition.position_profit_loss = (clientPosition.full_price_now - clientPosition.deal_full_price_avg) * clientPosition.position_qty * 10000 * ConsGlobal.bondPriceMultiple * (clientPosition.side == 0 ? 1 : -1); + clientPosition.price_now = bondPrice.net_price; + clientPosition.yield_now = bondPrice.yield * ConsGlobal.bondPriceMultiple; } } catch (Exception ex) diff --git a/YLErpDAL/Model/ClientCashInCashOut.cs b/YLErpDAL/Model/ClientCashInCashOut.cs index ebfb1351..5314f109 100644 --- a/YLErpDAL/Model/ClientCashInCashOut.cs +++ b/YLErpDAL/Model/ClientCashInCashOut.cs @@ -314,6 +314,11 @@ namespace YLErp.Model [DisplayName("操作来源")] public string Action { get; set; } /// + /// 账户类型初保账户/追保账户 + /// + [DisplayName("账户类型")] + public string cash_type { get; set; } + /// /// 加密主键 /// [NotMapped] diff --git a/YLErpDAL/Model/clientLinq.cs b/YLErpDAL/Model/clientLinq.cs index ed72f456..360fbf9c 100644 --- a/YLErpDAL/Model/clientLinq.cs +++ b/YLErpDAL/Model/clientLinq.cs @@ -274,7 +274,7 @@ namespace YLErp.Model [NotMapped] public double RoundedTotalAmount { - get { return AmountFundWithProduct + (RoundedPositionPv ?? 0) - (PrepaymentAmount ?? 0); } + get;set; } //账户资金(包含抵押品价值) @@ -405,6 +405,14 @@ namespace YLErp.Model /// 当日资金净出入 /// public double NetFund { get; set; } + /// + ///追保账户金额 + /// + public double VmFundSum { get; set; } + /// + /// 总出入金金额 + /// + public double NetFundAll { get; set; } /// /// 其他收支 @@ -563,5 +571,23 @@ namespace YLErp.Model public DateTime? LastSettlemetTime { get; set; } [NotMapped] public string LastHTSettlemetTime { get; set; } + + + /// + /// 维持保证金 + /// + public double MaintenanceMargin { get; set; } + /// + /// 互换合并盯市金额B=现金结存+∑(组合待实现收益) + /// + public double SwapMarketAmount { get; set; } + /// + /// 履约保证金比例:合并盯市价格/持仓名义本金 + /// + public decimal SwapMarketAmountPercent{get;set; } + /// + /// 是否需要追保 + /// + public bool NeedAddMargin { get; set; } } } diff --git a/YLErpDAL/Modules/ClientModule/ClientCashInCashOutDataService.cs b/YLErpDAL/Modules/ClientModule/ClientCashInCashOutDataService.cs index c2480c9a..e518ba56 100644 --- a/YLErpDAL/Modules/ClientModule/ClientCashInCashOutDataService.cs +++ b/YLErpDAL/Modules/ClientModule/ClientCashInCashOutDataService.cs @@ -599,6 +599,7 @@ namespace YLErp.Modules.ClientModule r.Action = req.Action; r.CashFlag = req.CashFlag; r.CurrencyCode = req.CurrencyCode; + r.cash_type = req.cash_type; } if (isARAP) @@ -659,26 +660,9 @@ namespace YLErp.Modules.ClientModule //如果出金大于可用资金(修改操作时需要算差价)则抛出错误 if (Math.Abs(r.Money ?? 0.0) > realAvailableFund) { - if ("出金".Equals(r.Direction)) - { - var msg = "添加出金失败,客户:" + r.ClientName + " 出金:" + r.Money + " 实际可取出资金:" + - (Math.Floor(realAvailableFund * 100) / 100).ToString("0.00") + ";"; - throw new ServiceException(msg); - } - else - { - var msg = "添加应付预付金失败,客户:" + r.ClientName + " 应付预付金:" + Math.Abs(r.Money ?? 0) + " 实际可取出资金:" + - (Math.Floor(realAvailableFund * 100) / 100).ToString("0.00") + ";"; - throw new ServiceException(msg); - } - } - } - - if ("出金".Equals(r.Direction) && PS.Config.Company == Configuration.CompanyEnum.中金) - { - if (!CheckClientCashOut(req.ClientId ?? 0, req.Money ?? 0, req.CurrencyCode)) - { - throw new ServiceException($"南向客户币种{req.CurrencyCode}的出金金额不能大于客户账户余额"); + var msg = "添加出金失败,客户:" + r.ClientName + " 出金:" + r.Money + " 实际可取出资金:" + + (Math.Floor(realAvailableFund * 100) / 100).ToString("0.00") + ";"; + throw new ServiceException(msg); } } @@ -934,10 +918,9 @@ namespace YLErp.Modules.ClientModule var clientbalance = ClientBalanceUtility.GetClientBanlances(new List { e.ClientId.Value }, DateTime.MinValue, DateTime.Now.Date).FirstOrDefault(); //当日可取现金 var availableFund = clientbalance == null ? 0 : clientbalance.DesirableFund; - var frozenOutFund = clientbalance == null ? 0 : clientbalance.FrozenOutFund; //对于0.999999999情况的数据做下处理 - var realAvailableFund = Math.Round((availableFund + frozenOutFund) * Math.Pow(10, 8)) / Math.Pow(10, 8); + var realAvailableFund = Math.Round((availableFund + (e.Money??0)) * Math.Pow(10, 8)) / Math.Pow(10, 8); //如果当前出金金额大于可用资金(不扣除冻结出金部分)则抛出错误 if (Math.Abs(e.Money ?? 0) > realAvailableFund) { diff --git a/YLErpDAL/Modules/ClientModule/EntryexitBLL.cs b/YLErpDAL/Modules/ClientModule/EntryexitBLL.cs index b1874873..f6cd93e1 100644 --- a/YLErpDAL/Modules/ClientModule/EntryexitBLL.cs +++ b/YLErpDAL/Modules/ClientModule/EntryexitBLL.cs @@ -469,7 +469,8 @@ namespace YLErp.BLL Action = source.Action, SerialNumber = source.SerialNumber, Comments = source.Comments, - TradeValidState=trade==null?"":trade.ValidState + TradeValidState=trade==null?"":trade.ValidState, + cash_type = source.cash_type, //TradeNumber = source.TradeNumber }; query = query.Where(x=>x.TradeValidState!=ConsGlobal.InValid); diff --git a/YLErpDAL/Modules/DataProviderModule/EodPriceQueryService.cs b/YLErpDAL/Modules/DataProviderModule/EodPriceQueryService.cs index f06a51bc..1bfd5c0d 100644 --- a/YLErpDAL/Modules/DataProviderModule/EodPriceQueryService.cs +++ b/YLErpDAL/Modules/DataProviderModule/EodPriceQueryService.cs @@ -225,6 +225,18 @@ namespace YLErp.Modules.DataProviderModule }; } /// + /// 获取中债估值最新价格 + /// + /// + /// + /// + public static ChinaBondValuation GetChinaBondPrice(DateTime valueDate, string underlyingCode) + { + using var db = DbContextFactory.GetYLDbContext(); + var bondPrice = db.china_bond_valuation.Where(x => x.bond_id == underlyingCode && x.valuation_date <= valueDate).OrderByDescending(o => o.credibility).ThenByDescending(o => o.valuation_date).FirstOrDefault(); + return bondPrice; + } + /// /// 获取标的收盘价格 /// /// 标的代码 diff --git a/YLErpDAL/Modules/EodModule/SettlementModule/EodCheckMonitoredTrade.cs b/YLErpDAL/Modules/EodModule/SettlementModule/EodCheckMonitoredTrade.cs index e5557639..3dc77b62 100644 --- a/YLErpDAL/Modules/EodModule/SettlementModule/EodCheckMonitoredTrade.cs +++ b/YLErpDAL/Modules/EodModule/SettlementModule/EodCheckMonitoredTrade.cs @@ -165,76 +165,44 @@ namespace YLErp.Modules.EodModule.SettlementModule var nextSettleDate = QdpCalendarHelper.GetNonHoliday(settleDate.AddDays(1)); var days = (nextSettleDate - settleDate).Days; logger.Info("settleDate:" + settleDate.ToString("yyyy-MM-dd") + " nextSettleDate:" + nextSettleDate + " days:" + days); - for (var i=0; i< days; i++) + for (var i = 0; i < days; i++) { - var yesterday= settleDate.AddDays(i-1); - var today= settleDate.AddDays(i); + var yesterday = settleDate.AddDays(i - 1); + var today = settleDate.AddDays(i); new SwapEodPositionService(OptUser).SwapPositionCompose(today, yesterday, clientIds); + CalculateMargin(today, yesterday, clientIds); new SwapEodPositionService(OptUser).SwapEodCompose(today, yesterday, clientIds); } - - } - /// - /// 追加预付金腿利息归档 - /// - public void ExceuteEodSwapMarginPosi() - { - var settleDate = _context.SettleDate; - var clientIds = _context.Request.ClientIds; - var nextSettleDate = QdpCalendarHelper.GetNonHoliday(settleDate.AddDays(1)); - var days = (nextSettleDate - settleDate).Days; - for (var i = 0; i < days; i++) - { - var yesterday = settleDate.AddDays(i - 1); - var today = settleDate.AddDays(i); - new SwapEodPositionService(OptUser).SwapEodCompose(today, yesterday, clientIds); - } - } - /// - /// 框架合约汇总 - /// - /// - public void ExecuteEodSwap() - { - var settleDate = _context.SettleDate; - var clientIds = _context.Request.ClientIds; - var nextSettleDate = QdpCalendarHelper.GetNonHoliday(settleDate.AddDays(1)); - var days = (nextSettleDate - settleDate).Days; - for (var i = 0; i < days; i++) - { - var yesterday = settleDate.AddDays(i - 1); - var today = settleDate.AddDays(i); - new SwapEodPositionService(OptUser).SwapEodCompose(today, yesterday, clientIds); - } - + } /// /// 计算互换预付金 /// /// - public bool CalculateMargin() + public bool CalculateMargin(DateTime settleDate, DateTime preSettleDate, IEnumerable ClientIds) { - var balanceDate = _context.SettleDate; - var preSettleDate = _context.PreSettleDate; - var reqClientIds = _context.Request.ClientIds; + // 构建请求对象 CalculateMarginRequest request = new CalculateMarginRequest() { - currentDate = balanceDate.ToString("yyyy-MM-dd"), - clientIds = reqClientIds, - preSettleDate= preSettleDate.ToString("yyyy-MM-dd") + currentDate = settleDate.ToString("yyyy-MM-dd"), + clientIds = ClientIds, + preSettleDate = preSettleDate.ToString("yyyy-MM-dd") }; var baseUrl = Environment.GetEnvironmentVariable("BondOmsInterface_BaseUrl"); var calculateMarginUrl = "/marginAlgorithm/triggerMarginCalc"; + if (!string.IsNullOrEmpty(baseUrl)) { var httpHelper = new HttpHelper(baseUrl, null); // http 请求 Web项目接口 var result = httpHelper.PostRequestNoAuth(calculateMarginUrl, request).Result; - if (result!=null&&!result.success) + + if (result != null && !result.success) { throw new ServiceException($"互换预付金计算失败:{result.message}"); } } + return true; } } diff --git a/YLErpDAL/Modules/EodModule/SettlementModule/EodCheckSwapFlow.cs b/YLErpDAL/Modules/EodModule/SettlementModule/EodCheckSwapFlow.cs new file mode 100644 index 00000000..e46b4202 --- /dev/null +++ b/YLErpDAL/Modules/EodModule/SettlementModule/EodCheckSwapFlow.cs @@ -0,0 +1,31 @@ +using Microsoft.EntityFrameworkCore; + +namespace YLErp.Modules.EodModule.SettlementModule +{ + /// + /// 检查日终流水 + /// + public class EodCheckSwapFlow : EodSettleServiceBaseV2 + { + public const string Step = "检查流水"; + + public EodCheckSwapFlow(EodSettlementContextV2 context) : base(context) + { + ResetDbContext(); + } + + /// + /// 检查结算汇率 + /// + public void Execute() + { + var settleDate = _context.SettleDate; + var swapFlowList = DbContext.swap_flow.Where(x=>x.OccurTime==settleDate&&x.DataState==(int)SwapFlowDateStateEnum.等待完成); + + if (swapFlowList.Any()) + { + _context.RaiseError(Step, $"{settleDate:yyyy-MM-dd}有未簿记的流水未处理"); + } + } + } +} diff --git a/YLErpDAL/Modules/EodModule/SettlementModule/EodClientBalanceCalc.cs b/YLErpDAL/Modules/EodModule/SettlementModule/EodClientBalanceCalc.cs index aff6b5a2..dd036bd0 100644 --- a/YLErpDAL/Modules/EodModule/SettlementModule/EodClientBalanceCalc.cs +++ b/YLErpDAL/Modules/EodModule/SettlementModule/EodClientBalanceCalc.cs @@ -5,6 +5,7 @@ using YieldChain.Helpers; using YLErp.BLL; using YLErp.BLL.MarginCalculation; using YLErp.Configuration; +using YLErp.DBModels.Enums; using YLErp.Helpers; using YLErp.Model; using YLErp.Model.Enum; @@ -202,7 +203,9 @@ namespace YLErp.Modules.EodModule.SettlementModule foreach (var currencyCode in currencyCodes) { fundObject.InFund.Add(currencyCode, 0); + fundObject.VmInFund.Add(currencyCode, 0); fundObject.OutFund.Add(currencyCode, 0); + fundObject.VmOutFund.Add(currencyCode, 0); fundObject.NetFund.Add(currencyCode, 0); fundObject.InFundOther.Add(currencyCode, 0); fundObject.OutFundOther.Add(currencyCode, 0); @@ -212,8 +215,10 @@ namespace YLErp.Modules.EodModule.SettlementModule } //入金 var inFund = 0.0; + var vmInFund = 0.0; //出金 var outFund = 0.0; + var vmOutFund = 0.0; //其他收入 var inFundOther = 0.0; //其他支出 @@ -340,9 +345,13 @@ namespace YLErp.Modules.EodModule.SettlementModule throw new Exception("客户:" + client.Name + "未配置结算币种"); } clientbalancedailyPre.FundObject.InFund.Add(client.SettlementCurrency, clientbalancedailyPre.InFund ?? 0); + clientbalancedailyPre.FundObject.VmInFund.Add(client.SettlementCurrency, clientbalancedailyPre.vm_in_fund ?? 0); clientbalancedailyPre.FundObject.InFundSum.Add(client.SettlementCurrency, clientbalancedailyPre.InFundSum ?? 0); + clientbalancedailyPre.FundObject.VmInFundSum.Add(client.SettlementCurrency, clientbalancedailyPre.vm_in_fund_sum ?? 0); clientbalancedailyPre.FundObject.OutFund.Add(client.SettlementCurrency, clientbalancedailyPre.OutFund ?? 0); + clientbalancedailyPre.FundObject.VmOutFund.Add(client.SettlementCurrency, clientbalancedailyPre.vm_out_fund ?? 0); clientbalancedailyPre.FundObject.OutFundSum.Add(client.SettlementCurrency, clientbalancedailyPre.OutFundSum ?? 0); + clientbalancedailyPre.FundObject.VmOutFundSum.Add(client.SettlementCurrency, clientbalancedailyPre.vm_out_fund_sum ?? 0); clientbalancedailyPre.FundObject.NetFund.Add(client.SettlementCurrency, clientbalancedailyPre.NetFund ?? 0); clientbalancedailyPre.FundObject.NetFundSum.Add(client.SettlementCurrency, clientbalancedailyPre.NetFundSum ?? 0); clientbalancedailyPre.FundObject.OtherFund.Add(client.SettlementCurrency, clientbalancedailyPre.OtherFund ?? 0); @@ -364,9 +373,13 @@ namespace YLErp.Modules.EodModule.SettlementModule if (currencyCodes.Count() == 1 && currencyCodes.FirstOrDefault() == string.Empty) { clientbalancedailyPre.FundObject.InFund.Add(string.Empty, clientbalancedailyPre.InFund ?? 0); + clientbalancedailyPre.FundObject.VmInFund.Add(string.Empty, clientbalancedailyPre.vm_in_fund ?? 0); clientbalancedailyPre.FundObject.InFundSum.Add(string.Empty, clientbalancedailyPre.InFundSum ?? 0); + clientbalancedailyPre.FundObject.VmInFundSum.Add(string.Empty, clientbalancedailyPre.vm_in_fund_sum ?? 0); clientbalancedailyPre.FundObject.OutFund.Add(string.Empty, clientbalancedailyPre.OutFund ?? 0); + clientbalancedailyPre.FundObject.VmOutFund.Add(string.Empty, clientbalancedailyPre.vm_out_fund ?? 0); clientbalancedailyPre.FundObject.OutFundSum.Add(string.Empty, clientbalancedailyPre.OutFundSum ?? 0); + clientbalancedailyPre.FundObject.VmOutFundSum.Add(string.Empty, clientbalancedailyPre.vm_out_fund_sum ?? 0); clientbalancedailyPre.FundObject.NetFund.Add(string.Empty, clientbalancedailyPre.NetFund ?? 0); clientbalancedailyPre.FundObject.NetFundSum.Add(string.Empty, clientbalancedailyPre.NetFundSum ?? 0); clientbalancedailyPre.FundObject.OtherFund.Add(string.Empty, clientbalancedailyPre.OtherFund ?? 0); @@ -376,9 +389,13 @@ namespace YLErp.Modules.EodModule.SettlementModule else { clientbalancedailyPre.FundObject.InFund.Add(client.SettlementCurrency, clientbalancedailyPre.InFund ?? 0); + clientbalancedailyPre.FundObject.VmInFund.Add(client.SettlementCurrency, clientbalancedailyPre.vm_in_fund ?? 0); clientbalancedailyPre.FundObject.InFundSum.Add(client.SettlementCurrency, clientbalancedailyPre.InFundSum ?? 0); + clientbalancedailyPre.FundObject.VmInFundSum.Add(client.SettlementCurrency, clientbalancedailyPre.vm_in_fund_sum ?? 0); clientbalancedailyPre.FundObject.OutFund.Add(client.SettlementCurrency, clientbalancedailyPre.OutFund ?? 0); + clientbalancedailyPre.FundObject.VmOutFund.Add(client.SettlementCurrency, clientbalancedailyPre.vm_out_fund ?? 0); clientbalancedailyPre.FundObject.OutFundSum.Add(client.SettlementCurrency, clientbalancedailyPre.OutFundSum ?? 0); + clientbalancedailyPre.FundObject.VmOutFundSum.Add(client.SettlementCurrency, clientbalancedailyPre.vm_out_fund_sum ?? 0); clientbalancedailyPre.FundObject.NetFund.Add(client.SettlementCurrency, clientbalancedailyPre.NetFund ?? 0); clientbalancedailyPre.FundObject.NetFundSum.Add(client.SettlementCurrency, clientbalancedailyPre.NetFundSum ?? 0); clientbalancedailyPre.FundObject.OtherFund.Add(client.SettlementCurrency, clientbalancedailyPre.OtherFund ?? 0); @@ -429,44 +446,35 @@ namespace YLErp.Modules.EodModule.SettlementModule if (clientEntryexit.Direction.Equals("入金")) { - if (fundObject.InFund.ContainsKey(clientEntryexit.CurrencyCode)) + // 根据 cash_type 判断资金进入哪个部分 + if (clientEntryexit.cash_type == CashTypeEnum.初保账户.ToString()) { - fundObject.InFund[clientEntryexit.CurrencyCode] += clientEntryexit.Money ?? 0; + AddToFund(fundObject.InFund, clientEntryexit.CurrencyCode, clientEntryexit.Money ?? 0); + // 更新 NetFund + AddToFund(fundObject.NetFund, clientEntryexit.CurrencyCode, clientEntryexit.Money ?? 0); } else { - fundObject.InFund.Add(clientEntryexit.CurrencyCode, clientEntryexit.Money ?? 0); + AddToFund(fundObject.VmInFund, clientEntryexit.CurrencyCode, clientEntryexit.Money ?? 0); } - if (fundObject.NetFund.ContainsKey(clientEntryexit.CurrencyCode)) - { - fundObject.NetFund[clientEntryexit.CurrencyCode] += clientEntryexit.Money ?? 0; - } - else - { - fundObject.NetFund.Add(clientEntryexit.CurrencyCode, clientEntryexit.Money ?? 0); - } + } else if (clientEntryexit.Direction.Equals("出金")) { - if (fundObject.OutFund.ContainsKey(clientEntryexit.CurrencyCode)) + // 根据 cash_type 判断资金退出到哪个部分 + if (clientEntryexit.cash_type == CashTypeEnum.初保账户.ToString()) { - fundObject.OutFund[clientEntryexit.CurrencyCode] += clientEntryexit.Money ?? 0; + AddToFund(fundObject.OutFund, clientEntryexit.CurrencyCode, clientEntryexit.Money ?? 0); + // 更新 NetFund + AddToFund(fundObject.NetFund, clientEntryexit.CurrencyCode, -(clientEntryexit.Money ?? 0)); } else { - fundObject.OutFund.Add(clientEntryexit.CurrencyCode, clientEntryexit.Money ?? 0); + AddToFund(fundObject.VmOutFund, clientEntryexit.CurrencyCode, clientEntryexit.Money ?? 0); } - if (fundObject.NetFund.ContainsKey(clientEntryexit.CurrencyCode)) - { - fundObject.NetFund[clientEntryexit.CurrencyCode] -= clientEntryexit.Money ?? 0; - } - else - { - fundObject.NetFund.Add(clientEntryexit.CurrencyCode, -clientEntryexit.Money ?? 0); - } } else if (clientEntryexit.Direction.Equals("其他收入")) { @@ -613,84 +621,15 @@ namespace YLErp.Modules.EodModule.SettlementModule }); } - - if (balanceDate >= new DateTime(2021, 6, 25) && PS.Config.Company == CompanyEnum.中金) - { - var clientCashInCashOutHistorys = DbContext.clientcashincashout_history.Where(x => x.ClientId == client.id && x.HappenDate == balanceDate).ToList(); - if (balanceDate == new DateTime(2021, 6, 25)) - { - clientCashInCashOutHistorys = DbContext.clientcashincashout_history.Where(x => x.ClientId == client.id && x.HappenDate <= new DateTime(2021, 6, 25)).ToList(); - } - - clientCashInCashOutHistorys.ForEach(item => - { - if (item.Action.Equals("入金")) - { - if (fundObject.InFund.ContainsKey("CNY")) - { - fundObject.InFund["CNY"] += item.Amount ?? 0; - } - else - { - fundObject.InFund.Add("CNY", item.Amount ?? 0); - } - - if (fundObject.NetFund.ContainsKey("CNY")) - { - fundObject.NetFund["CNY"] += item.Amount ?? 0; - } - else - { - fundObject.NetFund.Add("CNY", item.Amount ?? 0); - } - } - else if (item.Action.Equals("出金")) - { - if (fundObject.OutFund.ContainsKey("CNY")) - { - fundObject.OutFund["CNY"] += Math.Abs(item.Amount ?? 0); - } - else - { - fundObject.OutFund.Add("CNY", Math.Abs(item.Amount ?? 0)); - } - - //出金历史记录为负数,包含方向了 - if (fundObject.NetFund.ContainsKey("CNY")) - { - fundObject.NetFund["CNY"] += item.Amount ?? 0; - } - else - { - fundObject.NetFund.Add("CNY", item.Amount ?? 0); - } - } - else - { - if (item.Action.Equals("期权费")) - { - CurrChangeAmount += item.Amount ?? 0.0; - OptionPremium += item.Amount ?? 0.0; - } - else if (item.Action.Equals("结算金额")) - { - CurrChangeAmount += item.Amount ?? 0.0; - SettlementBalance += item.Amount ?? 0.0; - UnwindBalance += item.Amount ?? 0.0; - } - } - }); - } - foreach (var item in currencyCodes) { if (fundObject.TodayRemainFund.ContainsKey(item)) { - fundObject.TodayRemainFund[item] = (fundObject.LastDayRemainFund.ContainsKey(item) ? fundObject.LastDayRemainFund[item] : 0) + (fundObject.NetFund.ContainsKey(item) ? fundObject.NetFund[item] : 0) + (fundObject.OtherFund.ContainsKey(item) ? fundObject.OtherFund[item] : 0); + fundObject.TodayRemainFund[item] = (fundObject.LastDayRemainFund.ContainsKey(item) ? fundObject.LastDayRemainFund[item] : 0) + (fundObject.NetFund.ContainsKey(item) ? fundObject.NetFund[item] : 0) + (fundObject.VmInFund.ContainsKey(item) ? fundObject.VmInFund[item] : 0) - (fundObject.VmOutFund.ContainsKey(item) ? fundObject.VmOutFund[item] : 0); } else { - fundObject.TodayRemainFund.Add(item, (fundObject.LastDayRemainFund.ContainsKey(item) ? fundObject.LastDayRemainFund[item] : 0) + (fundObject.NetFund.ContainsKey(item) ? fundObject.NetFund[item] : 0) + (fundObject.OtherFund.ContainsKey(item) ? fundObject.OtherFund[item] : 0)); + fundObject.TodayRemainFund.Add(item, (fundObject.LastDayRemainFund.ContainsKey(item) ? fundObject.LastDayRemainFund[item] : 0) + (fundObject.NetFund.ContainsKey(item) ? fundObject.NetFund[item] : 0) + (fundObject.VmInFund.ContainsKey(item) ? fundObject.VmInFund[item] : 0) - (fundObject.VmOutFund.ContainsKey(item) ? fundObject.VmOutFund[item] : 0)); } if ((client.SettlementCurrency ?? "CNY") == item || item == "") @@ -719,7 +658,9 @@ namespace YLErp.Modules.EodModule.SettlementModule CurrAvailAmount += fundObject.TodayRemainFund[item] * rateObj.Rate; LastDayAvailAmount += fundObject.LastDayRemainFund[item] * rateObj.Rate; inFund += fundObject.InFund[item] * rateObj.Rate; + vmInFund += fundObject.VmInFund[item] * rateObj.Rate; outFund += fundObject.OutFund[item] * rateObj.Rate; + vmOutFund += fundObject.VmOutFund[item] * rateObj.Rate; NetFund += fundObject.NetFund[item] * rateObj.Rate; inFundOther += fundObject.InFundOther[item] * rateObj.Rate; outFundOther += fundObject.OutFundOther[item] * rateObj.Rate; @@ -1019,33 +960,6 @@ namespace YLErp.Modules.EodModule.SettlementModule } #endregion - #region 国君收益互换--导入持仓 - - //获取客户导入的所有持仓信息 -- 收益互换(国君) - var clientEodPositionSwapMannual = EodPositionSwapMannual.Where(x => x.ClientId == client.id).ToList(); - if (clientEodPositionSwapMannual.Any()) - { - double swapMargin = 0.0; - double swappv = 0.0; - double swappnl = 0.0; - clientEodPositionSwapMannual.ForEach(x => - { - var underly = underlyDataSource.GetData(x.UnderlyingCode); - var variety = varietyDataSource.GetData(underly.UnderlyingTypeId); - currencyProvider.TryGetCurrencyRate(variety.QuoteCurrency, client.SettlementCurrency, out var rateObj); - //预付金导入是客户方向,其他值是交易员方向 - swapMargin += (x.Margin) * rateObj.Rate; - swappv += (-x.PositionPnl + x.TotalFee) * rateObj.Rate; - swappnl += (-x.PositionPnl * rateObj.Rate); - }); - PayableMargin -= swapMargin; - clientPv = (clientPv ?? 0) + swappv; - roundedClientPv = (roundedClientPv ?? 0) + swappv; - PositionPnl += swappnl; - RoundedPositionPnl += swappnl; - } - - #endregion #region ClientBalacedaily ClientBalace对象赋值 if (client.BoundSide == BoundSideEnum.南向 && clientSpan != null) @@ -1091,7 +1005,9 @@ namespace YLErp.Modules.EodModule.SettlementModule clientbalancedaily.FrozenRedeemFunds = clientFrozenFund.RedeemFunds; clientbalancedaily.MarginBalance = MarginBalance; clientbalancedaily.InFund = inFund; + clientbalancedaily.vm_in_fund = vmInFund; clientbalancedaily.OutFund = outFund; + clientbalancedaily.vm_out_fund = vmOutFund; clientbalancedaily.NetFund = NetFund; clientbalancedaily.OtherFund = OtherFund; clientbalancedaily.IsTradeCredit = IsTradeCredit; @@ -1216,14 +1132,22 @@ namespace YLErp.Modules.EodModule.SettlementModule clientbalancedaily.NetFundSum += clientbalancedaily.FundObject.NetFundSum[item] * rateObj.Rate; clientbalancedailyPre.FundObject.InFundSum.TryGetValue(item, out var preInFundSum); + clientbalancedailyPre.FundObject.VmInFundSum.TryGetValue(item, out var vmpreInFundSum); clientbalancedaily.FundObject.InFund.TryGetValue(item, out var inFundToday); + clientbalancedaily.FundObject.VmInFund.TryGetValue(item, out var vminFundToday); clientbalancedaily.FundObject.InFundSum[item] = preInFundSum + inFundToday; + clientbalancedaily.FundObject.VmInFundSum[item] = vmpreInFundSum + vminFundToday; clientbalancedaily.InFundSum += clientbalancedaily.FundObject.InFundSum[item] * rateObj.Rate; + clientbalancedaily.vm_in_fund_sum += clientbalancedaily.FundObject.VmInFundSum[item] * rateObj.Rate; clientbalancedailyPre.FundObject.OutFundSum.TryGetValue(item, out var preOutFundSum); clientbalancedaily.FundObject.OutFund.TryGetValue(item, out var outFundToday); + clientbalancedailyPre.FundObject.VmOutFundSum.TryGetValue(item, out var vmpreOutFundSum); + clientbalancedaily.FundObject.VmOutFund.TryGetValue(item, out var vmoutFundToday); clientbalancedaily.FundObject.OutFundSum[item] = preOutFundSum + outFundToday; + clientbalancedaily.FundObject.VmOutFundSum[item] = vmpreOutFundSum + vmoutFundToday; clientbalancedaily.OutFundSum += clientbalancedaily.FundObject.OutFundSum[item] * rateObj.Rate; + clientbalancedaily.vm_out_fund_sum += clientbalancedaily.FundObject.VmOutFundSum[item] * rateObj.Rate; clientbalancedailyPre.FundObject.OtherFundSum.TryGetValue(item, out var preOtherFundSum); clientbalancedaily.FundObject.OtherFund.TryGetValue(item, out var otherFundToday); @@ -1246,11 +1170,15 @@ namespace YLErp.Modules.EodModule.SettlementModule clientbalancedaily.FundObject.NetFundSum = clientbalancedaily.FundObject.NetFund; clientbalancedaily.FundObject.InFundSum = clientbalancedaily.FundObject.InFund; clientbalancedaily.FundObject.OutFundSum = clientbalancedaily.FundObject.OutFund; + clientbalancedaily.FundObject.VmInFundSum = clientbalancedaily.FundObject.VmInFund; + clientbalancedaily.FundObject.VmOutFundSum = clientbalancedaily.FundObject.VmOutFund; clientbalancedaily.FundObject.OtherFundSum = clientbalancedaily.FundObject.OtherFund; clientbalancedaily.NetFundSum = clientbalancedaily.NetFund; clientbalancedaily.InFundSum = clientbalancedaily.InFund; + clientbalancedaily.vm_in_fund_sum= clientbalancedaily.vm_in_fund; clientbalancedaily.OutFundSum = clientbalancedaily.OutFund; + clientbalancedaily.vm_out_fund_sum = clientbalancedaily.vm_out_fund; clientbalancedaily.OtherFundSum = clientbalancedaily.OtherFund; } @@ -1375,5 +1303,16 @@ namespace YLErp.Modules.EodModule.SettlementModule return true; } + private void AddToFund(Dictionary fundDictionary, string currencyCode, double amount) + { + if (fundDictionary.ContainsKey(currencyCode)) + { + fundDictionary[currencyCode] += amount; + } + else + { + fundDictionary.Add(currencyCode, amount); + } + } } } \ No newline at end of file diff --git a/YLErpDAL/Modules/EodModule/SettlementModule/EodTaskRunner.cs b/YLErpDAL/Modules/EodModule/SettlementModule/EodTaskRunner.cs index d632c345..c3e49995 100644 --- a/YLErpDAL/Modules/EodModule/SettlementModule/EodTaskRunner.cs +++ b/YLErpDAL/Modules/EodModule/SettlementModule/EodTaskRunner.cs @@ -489,7 +489,8 @@ where {nameof(t.TaskStartTime)}>'{startDateStr}' and {nameof(t.TaskState)}={(int { new EodCheckCurrency(_context).Execute(); } - + SetTaskStep("检查日终流水"); + new EodCheckSwapFlow(_context).Execute(); tasks = new Task[3]; tasks[0] = Task.Run(() => @@ -497,9 +498,6 @@ where {nameof(t.TaskStartTime)}>'{startDateStr}' and {nameof(t.TaskState)}={(int SetTaskStep("检查标的到期日"); new EodCheckMaturityDate(_context).Execute();//t - SetTaskStep("合成篮子标的价格"); - new EodBasketPriceSaveService(_context).Execute();//t - if (PS.Config.ErpElement.SupportMultiCalendar) { SetTaskStep("为处于节假日的交易标的复制上日收盘价"); @@ -508,121 +506,17 @@ where {nameof(t.TaskStartTime)}>'{startDateStr}' and {nameof(t.TaskState)}={(int SetTaskStep("检查标的结算价格缺失"); new EodCheckSettlePrice(_context).Execute();//t - - if (PS.Config.Is厦门象屿) - { - SetTaskStep("检查标的参考价格缺失"); - new EodCheckReferencePrice(_context).Execute();//t - } }); - - if (_request.IsSettleOtcTrades) - { - tasks[1] = Task.Run(() => - { - //SetTaskStep("合成多空组合流水"); - //new EodHandleSwapFlowService(_context).Execute(); - - SetTaskStep("检查当日交易"); - new EodCheckNewTrade(_context).Execute();//t - - SetTaskStep("日终结算检查"); - new EodCheckVolService(_context).Execute();//t - - SetTaskStep("合成互换交易"); - new TradeSwapFlowMoreCheck(_context).Execute();//t - }); - } - - if (_request.IsSettleOtcTrades) - { - tasks[2] = Task.Run(() => - { - SetTaskStep("汇率收盘结算"); - new EodCurrencyRateService(_request.UserInfo).HandleAmountByCurrencyRate(_context.SettleDate, _context.Request.ClientIds);//t - }); - } - WaitTasks(tasks); if (_request.IsSettleOtcTrades) { - tasks = new[] - { - Task.Run(() => - { - SetTaskStep("检查期权观察状态1"); - new EodCheckMonitoredTrade(_context).ExecuteTask1(SetTaskStep);//t - }), - Task.Run(() => - { - SetTaskStep("检查期权观察状态2"); - new EodCheckMonitoredTrade(_context).ExecuteTask2(SetTaskStep);//t - }), - // Task.Run(() => - //{ - // SetTaskStep("定期结算互换收益"); - // new EodCheckMonitoredTrade(_context).ExecuteBalanceSwapProfit(SetTaskStep);//t - //}) - Task.Run(() => - { - SetTaskStep("定期归档收益互换"); - new EodCheckMonitoredTrade(_context).ExecuteEodSwapPosition(SetTaskStep);//t - }) - }; - - WaitTasks(tasks); - - SetTaskStep("自动延期结算"); - new EodDelaySettlementTrade(_context).Execute(_report.SetErrorTips);//t - + SetTaskStep("检查当日交易"); + new EodCheckNewTrade(_context).Execute();//t SetTaskStep("检查当日到期交易"); new EodCheckMaturityTrade(_context).Execute();//t + SetTaskStep("定期归档收益互换"); + new EodCheckMonitoredTrade(_context).ExecuteEodSwapPosition(SetTaskStep);//t } - new EodCheckMonitoredTrade(_context).CalculateMargin(); - new EodCheckMonitoredTrade(_context).ExecuteEodSwap(); - tasks = new Task[4]; - - if (_request.IsSettleExchangeTrades) - { - //tasks[0] = Task.Run(() => - //{ - // if (_context.Request.ClientIds == null) - // { - // SetTaskStep("场内期权结算"); - // new ExchangeOptionSettlementService(_context.UserInfo).Execute(_context.SettleDate); //t - // } - //}); - - - } - - if (_request.IsSettleOtcTrades) - { - tasks[0] = Task.Run(() => - { - SetTaskStep("备份场外交易"); - SaveEodTrade(_context, _cancellationTokenSource.Token);//t - }); - tasks[1] = Task.Run(() => - { - SetTaskStep("检查权利金应付日"); - new EodCheckPremiumPayDate(_context).Execute();//t - }); - - if (_context.SettlementConfig.CalcForwradMargin) - { - tasks[2] = Task.Run(() => - { - SetTaskStep("远期预付金成本结算"); - new EodForwardMarginSettlement(_context).Execute();//t - }); - } - } - - //敏感数据计算 - - - WaitTasks(tasks); } SetTaskStep("日终持仓结算"); @@ -648,61 +542,7 @@ where {nameof(t.TaskStartTime)}>'{startDateStr}' and {nameof(t.TaskState)}={(int SetTaskStep("结算客户资金"); new EodClientBalanceCalc(_context).ClientBalanceCalc(); - - //客户资金买卖权分开算 - if (_context.SettlementConfig.CalcBuySell) - { - new EodClientBalanceCalcBS(_context.UserInfo).ClientBalanceByDay(_context.SettleDate, null); - } _context.LogInfo("结束任务:结算客户资金"); - - if (PS.Config.ErpElement.UseSettleDataAcquisition) - { - SetTaskStep("配合数据采集,限额监控数据落地"); - var service = new QuotaMonitorService(_context.UserInfo); - if (_context.IsCurrentDay) - { - service.EodSettlementExecute(_context.SettleDate); - } - - service.EodSensitiveDataCalc(_context); - - _context.LogInfo("结束任务:限额监控数据落地"); - } - - //todo:客户日终结算完成发送行权到期邮件提醒 - - tasks = new Task[2]; - - if (_request.IsSettleExchangeTrades) - { - tasks[0] = Task.Run(() => - { - SetTaskStep("准备次日数据"); - new EodDividenService(_context).Execute(eodPositionService.EodTradePositions);//t - }); - } - - if (_request.IsSettleOtcTrades) - { - tasks[1] = Task.Run(() => - { - SetTaskStep("除权除息"); - var otcTrades = _context.OtcTrades.Where(t => !ConsTrade.TradeCompleteStatus.Contains(t.TradeStatus)).ToList(); - var tradeIds = otcTrades.Select(O => O.id); - var parentTradeIds = otcTrades.Where(O => O.ParentTradeId > 0 && !tradeIds.Contains(O.ParentTradeId)).Select(O => O.ParentTradeId).ToHashSet(); - if (parentTradeIds.Any()) - { - using var db = DbContextFactory.GetYLDbContext(); - var parentTrades = new TradeDalService(_context.UserInfo).GetTradeOrEodTrade(parentTradeIds, _context.SettleDate); - otcTrades.AddRange(parentTrades); - } - new EodDividenService(_context).Execute(otcTrades); - - }); - } - - WaitTasks(tasks); } _cancellationTokenSource.Token.ThrowIfCancellationRequested(); @@ -711,32 +551,6 @@ where {nameof(t.TaskStartTime)}>'{startDateStr}' and {nameof(t.TaskState)}={(int //{ AddOrUpdateEodStatus(_request); //} - - //兴证日终持仓数据上传数据中心的FTP服务器 - if (PS.Config.Company == CompanyEnum.兴证 && _context.IsCurrentDay) - { - Task.Run(() => XingZhengService.EodExecute(_context)); - } - - //日终数据采集 - if (PS.Config.Company == CompanyEnum.长江) - { - Task.Run(() => ChangJiangService.EodExecute(_context, _request.VolType, _request.UseClosePrice ? "收盘价" : "结算价")); - } - - //东证 - if (PS.Config.Company == CompanyEnum.润和) - { - Task.Run(() => DongZhengService.EodExecute(_context)); - } - - - //广发商贸 - if (PS.Config.Company == CompanyEnum.广发商贸 && _request.VolType == "对冲" && _request.UseClosePrice) - { - Task.Run(() => GuangFaService.EodExecute(_context)); - } - sw.Stop(); elapsedMilliseconds = sw.ElapsedMilliseconds; diff --git a/YLErpDAL/Modules/MarginModule/MarginRateSwapService.cs b/YLErpDAL/Modules/MarginModule/MarginRateSwapService.cs index f00f87cc..0681cdeb 100644 --- a/YLErpDAL/Modules/MarginModule/MarginRateSwapService.cs +++ b/YLErpDAL/Modules/MarginModule/MarginRateSwapService.cs @@ -82,10 +82,9 @@ namespace YLErp.Modules.MarginModule { ClientName = reader.GetString("客户名称", false), ValueDate = reader.GetDate("起效日期", true) ?? DateTime.Now, - InitMarginRate = reader.GetPercent("期初预付金", false) ?? 0, - InitMarginRebateRate = reader.GetDecimalPercent("期初预付金利率", false) ?? 0, - AddToMarginRebateRate= reader.GetDecimalPercent("追加预付金利率", false) ?? 0, - SwapEndDays=reader.GetInt("互换默认期限",true) + InitMarginRate = reader.GetPercent("初始保证金率", true) ?? 0, + MaintenanceRate = reader.GetPercent("维持保证金率", true) ?? 0, + SwapEndDays =reader.GetInt("互换默认期限",true) }; var client = new Client(); marginRate.Type = "普通"; @@ -133,6 +132,7 @@ namespace YLErp.Modules.MarginModule dbMarginRate.LongInitMarginRate = marginrate.LongInitMarginRate; dbMarginRate.ShortInitMarginRate = marginrate.ShortInitMarginRate; dbMarginRate.SwapEndDays = marginrate.SwapEndDays; + dbMarginRate.MaintenanceRate= marginrate.MaintenanceRate; dbMarginRate.OptId = UserId; dbMarginRate.OptName = UserName; dbMarginRate.OptDate = DateTime.Now; @@ -167,6 +167,7 @@ namespace YLErp.Modules.MarginModule dbMarginRate.LongInitMarginRate = marginrate.LongInitMarginRate; dbMarginRate.ShortInitMarginRate = marginrate.ShortInitMarginRate; dbMarginRate.SwapEndDays = marginrate.SwapEndDays; + dbMarginRate.MaintenanceRate = marginrate.MaintenanceRate; dbMarginRate.OptId = UserId; dbMarginRate.OptName = UserName; dbMarginRate.OptDate = DateTime.Now; diff --git a/YLErpDAL/Modules/ReportModule/SettlementReportModule/FundReportModel.cs b/YLErpDAL/Modules/ReportModule/SettlementReportModule/FundReportModel.cs index 5b1c8008..b5b99fee 100644 --- a/YLErpDAL/Modules/ReportModule/SettlementReportModule/FundReportModel.cs +++ b/YLErpDAL/Modules/ReportModule/SettlementReportModule/FundReportModel.cs @@ -17,7 +17,66 @@ namespace YLErp.Modules.ReportModule return ((LastDayRemainFund == null || LastDayRemainFund == -0) ? 0 : LastDayRemainFund.Value).ToString("0.00"); } } + /// + /// 初始保证金金额 + /// + public double? MySideMargin { get; set; } + public string MySideMarginString + { + get + { + return ((MySideMargin == null || MySideMargin == -0) ? 0 : MySideMargin.Value).ToString("0.00"); + } + } + /// + /// 预付金余额 + /// + public double? MarginBalance { get; set; } + + public string MarginBalanceString + { + get + { + return ((MarginBalance == null || MarginBalance == -0) ? 0 : MarginBalance.Value).ToString("0.00"); + } + } + /// + /// 初保账户 + /// + public double? NetFundAll { get; set; } + + public string NetFundAllString + { + get + { + return ((NetFundAll == null || NetFundAll == -0) ? 0 : NetFundAll.Value).ToString("0.00"); + } + } + /// + /// 盯市金额 + /// + public double? SwapMarketAmount { get; set; } + + public string SwapMarketAmountString + { + get + { + return ((SwapMarketAmount == null || SwapMarketAmount == -0) ? 0 : SwapMarketAmount.Value).ToString("0.00"); + } + } + /// + /// 追保账户 + /// + public double? VmFundSum { get; set; } + + public string VmFundSumString + { + get + { + return ((VmFundSum == null || VmFundSum == -0) ? 0 : VmFundSum.Value).ToString("0.00"); + } + } /// /// 上日资金(包含抵押金额) /// diff --git a/YLErpDAL/Modules/ReportModule/SettlementReportModule/SettlementReportFotShanXiService.cs b/YLErpDAL/Modules/ReportModule/SettlementReportModule/SettlementReportFotShanXiService.cs index 424f0777..a6411295 100644 --- a/YLErpDAL/Modules/ReportModule/SettlementReportModule/SettlementReportFotShanXiService.cs +++ b/YLErpDAL/Modules/ReportModule/SettlementReportModule/SettlementReportFotShanXiService.cs @@ -261,7 +261,7 @@ namespace YLErp.Modules.ReportModule.SettlementReportModule modelDict.Add("质押记录", report.clientcashincashout_productLinq); } var sourcePath = OtcAppContext.MapPath("~/App_Docs/导出模板"); - string sourceFileName = Path.Combine(sourcePath, $"结算报告模板_{PS.Config.Company}.xlsx"); + string sourceFileName = Path.Combine(sourcePath, $"结算报告模板.xlsx"); ExcelPackage.LicenseContext = LicenseContext.NonCommercial; var pdffile = ExcelTemplate.GeneratePDFFromExeclTemplate(sourcePath, sourceFileName, modelDict, targetPath, targetFileName , shouldDeleteSheet: true, needToPdf: false); @@ -288,7 +288,7 @@ namespace YLErp.Modules.ReportModule.SettlementReportModule { LastDayRemainFund = clientBalance?.LastDayRemainFund ?? 0, LastDayRemainFundWithProduct = clientBalance?.LastDayRemainFundWithProduct ?? 0, - CashInCashOutChange = clientBalance?.NetFund ?? 0, + CashInCashOutChange = clientBalance?.NetFundAll ?? 0, CashInChange = clientBalance?.InFund ?? 0, CashOutChange = clientBalance?.OutFund ?? 0, CashInCashOutOther = clientBalance?.OtherFund ?? 0, @@ -326,7 +326,12 @@ namespace YLErp.Modules.ReportModule.SettlementReportModule TotalNetSettlement = clientBalance?.TotalNetSettlementTotal ?? 0, ClientSellPositionPnl = clientBalance?.ClientSellPositionPnl, FreezePremium = clientBalance?.FreezePremium, - EndDesirableFund = clientBalance?.EndDesirableFund ?? 0 + EndDesirableFund = clientBalance?.EndDesirableFund ?? 0, + MySideMargin= clientBalance?.MySideMargin, + MarginBalance= clientBalance?.MarginBalance, + NetFundAll = clientBalance?.NetFundAll, + SwapMarketAmount= clientBalance?.SwapMarketAmount, + VmFundSum= clientBalance?.VmFundSum, }; return FundReportModel; } @@ -381,17 +386,12 @@ namespace YLErp.Modules.ReportModule.SettlementReportModule { return QdpCalendarHelper.GetNonHoliday(DateTime.Now < DateTime.Now.Date.AddHours(9).AddMinutes(30) ? DateTime.Now : DateTime.Now.AddDays(1)).ToString("yyyy年MM月dd日") + "上午9:30"; } - case "追保金额": return report.FundReportModel.MarginString; - case "大写追保金额": return NumberHelper.CmycurD(report.FundReportModel.Margin ?? 0); - case "应付资金总额": return report.FundReportModel.PayableFundString; - case "大写应付资金总额": return NumberHelper.CmycurD(report.FundReportModel.PayableFund ?? 0); + case "追保金额": return report.FundReportModel.PositionTradePayableFundString; + case "大写追保金额": return NumberHelper.CmycurD(report.FundReportModel.PositionTradePayableFund ?? 0); + case "预付金余额": return report.FundReportModel.MarginBalanceString; + case "初始保证金金额": return report.FundReportModel.MySideMarginString; case "发送日期": return DateTime.Now.ToString("yyyy-MM-dd"); - case "预付金占用": return report.FundReportModel.WorstCastClientPayableString; case "可用资金": return report.FundReportModel.AvailableFundString; - case "授信额度": return report.FundReportModel.CreditString; - case "应付了结交易款": return report.FundReportModel.ClosedTradePayableFundString; - case "应付存续交易款": return report.FundReportModel.PositionTradePayableFundString; - case "存续交易期权费净额": return report.FundReportModel.PositionPremiumNetCashString; case "可取资金": return report.FundReportModel.DesirableFundString; case "起始日期": return report.ReportFrom.ToString("yyyy-MM-dd"); case "结束日期": return report.ReportEnd.ToString("yyyy-MM-dd"); diff --git a/YLErpDAL/Modules/RiskModule/QuotaMonitorService.cs b/YLErpDAL/Modules/RiskModule/QuotaMonitorService.cs index c2b5f0d4..159ceb0e 100644 --- a/YLErpDAL/Modules/RiskModule/QuotaMonitorService.cs +++ b/YLErpDAL/Modules/RiskModule/QuotaMonitorService.cs @@ -4096,6 +4096,11 @@ namespace YLErp.Modules.RiskModule { throw new ServiceException("未找到客户信息"); } + var dealDate = DateTime.Parse(clientRiskCheckReq.dealDate); + if (client.EvaluateExpireDate< dealDate) + { + throw new ServiceException("适当性评估已经过期,只有在适当性有效期内才可以新开仓"); + } using var bondDb = new BondOmsDBContext(); var (clientPositions, clientOrderPositions) = GetClientPositionsAndOrders(bondDb, clientRiskCheckReq.orderId); var position = clientPositions @@ -4106,7 +4111,7 @@ namespace YLErp.Modules.RiskModule AddClientRiskCheckPosition(clientRiskCheckReq, clientPositions); var umCodes = GetUnderlyingCodes(clientPositions, clientRiskCheckReq.securityId); var ums = GetUnderlyings(umCodes); - var dealDate = DateTime.Parse(clientRiskCheckReq.dealDate); + var checkPoisiList = BuildCheckQuotaMoitorModels(clientPositions, ums, dealDate); foreach (var settingItem in precheckQuotaSettingList) { @@ -4150,15 +4155,14 @@ namespace YLErp.Modules.RiskModule } private (List, List) GetClientPositionsAndOrders(BondOmsDBContext bondDb, long orderId) { - var clientLongIds = DataCacheProvider.GetClientDataSource() - .AsQueryable() - .Where(s => s.BusinessUseType == "否") - .Select(s => (long)s.id) - .ToList(); - var clientPositions = bondDb.client_position.Where(x => clientLongIds.Contains(x.client_id ?? 0)).AsNoTracking().ToList(); + var clientPositions = bondDb.client_position.AsNoTracking().ToList(); var startDate = DateTime.Now.Date; var nextDate = startDate.AddDays(1); var clientOrderPositions = bondDb.client_order.Where(x => x.status == 0 && x.create_time > startDate && x.create_time < nextDate && x.id != orderId).AsNoTracking().ToList(); + clientPositions.ForEach(x => + { + x.position_qty *= 10000; + }); return (clientPositions, clientOrderPositions); } /// @@ -4170,29 +4174,48 @@ namespace YLErp.Modules.RiskModule /// private List FilterPrecheckQuotaSettings(List precheckQuotaSettingList, ClientRiskCheckItemParam clientRiskCheckReq) { - // 过滤出与当前客户端相关的配额设置 - var clientPrecheckQuotaSettingList = precheckQuotaSettingList - .Where(x => x.QuotaRange == clientRiskCheckReq.clientId && x.QuotaType == QuotaTypeEnum.CLIENT) - .ToList(); - - // 过滤出所有客户端通用的配额设置 - var allClientPrecheckQuotaSettingList = precheckQuotaSettingList - .Where(x => x.QuotaRange == 0 && x.QuotaType == QuotaTypeEnum.CLIENT) - .ToList(); - - // 获取底层数据源 + var clientId = clientRiskCheckReq.clientId; var um = DataCacheProvider.GetUnderlyingDataSource().GetData(clientRiskCheckReq.securityId); - var noneClientAllUnderlyingPrecheckQuotaSettingList = precheckQuotaSettingList - .Where(x => x.QuotaType == QuotaTypeEnum.UNDERLYING) - .ToList(); - // 处理客户端相关的配额设置 - if (clientPrecheckQuotaSettingList.Count > 0) - { - precheckQuotaSettingList = precheckQuotaSettingList - .Except(allClientPrecheckQuotaSettingList) - .ToList(); - } - return precheckQuotaSettingList; + var underlyingId = um?.id; + + // 分离三种类型数据 + var clientQuotas = precheckQuotaSettingList.Where(x => x.QuotaType == QuotaTypeEnum.CLIENT); + var underlyingQuotas = precheckQuotaSettingList.Where(x => x.QuotaType == QuotaTypeEnum.UNDERLYING); + var otherQuotas = precheckQuotaSettingList.Where(x => + x.QuotaType != QuotaTypeEnum.CLIENT && + x.QuotaType != QuotaTypeEnum.UNDERLYING + ); + // 1. CLIENT类型处理(按QuotaIndex分组+三层优先级) + var filteredClient = clientQuotas + .GroupBy(x => x.QuotaIndex) + .SelectMany(g => { + // 优先级1: QuotaRange=clientId + var p1 = g.Where(x => x.QuotaRange == clientId); + if (p1.Any()) return p1; + + // 优先级2: QuotaRange=0 + return g.Where(x => x.QuotaRange == 0); + }) + .ToList(); + + + // 2. UNDERLYING类型分层筛选 + var filteredUnderlying = underlyingQuotas + .GroupBy(x => x.QuotaIndex) + .SelectMany(g => { + // 优先级1: QuotaRange=underlyingId + var p1 = g.Where(x => x.QuotaRange == underlyingId); + if (p1.Any()) return p1; + + // 优先级2: QuotaRange=0 + return g.Where(x => x.QuotaRange == 0); + }).ToList(); + + // 3. 合并所有类型(保留其他类型原样) + return filteredClient + .Concat(filteredUnderlying) + .Concat(otherQuotas) + .ToList(); } /// /// 构建风控指标类 @@ -4234,8 +4257,8 @@ namespace YLErp.Modules.RiskModule full_price_now = item.full_price, deal_full_price_avg = item.full_price ?? 0, client_id = item.client_id, - position_qty = item.order_qty, - position_notional_principal = item.full_price * item.order_qty* ConsGlobal.bondPriceMultiple, + position_qty = item.order_qty*10000, + position_notional_principal = item.full_price * item.order_qty* ConsGlobal.bondPriceMultiple * 10000, direction = (int)SwapDirectionEnum.支付, id = item.id, Current = false, @@ -4259,11 +4282,11 @@ namespace YLErp.Modules.RiskModule deal_full_price_avg = clientRiskCheckReq.price * ConsGlobal.bondShowPriceMultiple, client_id = clientRiskCheckReq.clientId, position_qty = clientRiskCheckReq.qty, - position_notional_principal = clientRiskCheckReq.amount, direction = (int)SwapDirectionEnum.支付, id = clientRiskCheckReq.orderId, Current = true, }; + posi.position_notional_principal = posi.position_qty * posi.deal_full_price_avg* ConsGlobal.bondPriceMultiple; clientPositions.Add(posi); } /// @@ -5296,6 +5319,7 @@ namespace YLErp.Modules.RiskModule switch (checkItem.quotaType) { case "轧差名义本金": + currentValue = Math.Abs(Convert.ToDouble(currentPv)); if (!ValidateQuoteResult(checkItem, currentValue, posiVal)) { return checkItem; diff --git a/YLErpDAL/Modules/SwapModule/SwapEodPositionService.cs b/YLErpDAL/Modules/SwapModule/SwapEodPositionService.cs index 251d1229..6af4a5e0 100644 --- a/YLErpDAL/Modules/SwapModule/SwapEodPositionService.cs +++ b/YLErpDAL/Modules/SwapModule/SwapEodPositionService.cs @@ -100,7 +100,6 @@ namespace YLErp.Modules.SwapModule var tradePositionList = allTradePositionList.Where(t => t.IsInitial).ToList(); var tradeRealPositionList = allTradePositionList.Where(t => !t.IsInitial).ToList(); var tradeExtendList = DbContext.trade_extend.Where(x => tradeIds.Contains(x.TradeId)).ToList(); - var eodSwapPositionList = DbContext.eod_swap_position.Where(x => x.ValueDate >= preSettleDate && x.ValueDate <= settleDate && tradeIds.Contains(x.SwapTradeId) && !x.Invalid).ToList(); var eodSwapList = DbContext.eod_swap.Where(x => x.ValueDate == preSettleDate).ToList(); List eventTyps = new List() { (int)SwapEventTypeEnum.平仓, (int)SwapEventTypeEnum.互换, (int)SwapEventTypeEnum.自动互换 }; foreach (var td in tradeQueryList) @@ -123,7 +122,7 @@ namespace YLErp.Modules.SwapModule { throw new Exception($"交易{td.TradeNumber}在上一交易日【{preSettleDate:yyyy-MM-dd}】未收盘"); } - var allEodPositions = eodSwapPositionList.Where(x => x.ValueDate >= preSettleDate && x.SwapTradeId == td.id && !x.Invalid); + var allEodPositions = DbContext.eod_swap_position.Where(x => x.ValueDate >= preSettleDate && x.SwapTradeId == td.id && !x.Invalid); var eodPositions = allEodPositions.Where(x => x.ValueDate == preSettleDate).ToList();//上一日终持仓信息 @@ -828,17 +827,18 @@ namespace YLErp.Modules.SwapModule newEodPayPosition.InterestDirection = position.InterestDirection; newEodPayPosition.InterestMode = position.InterestMode; newEodPayPosition.InterestPrincipalFix = position.InterestPrincipalFix; + newEodPayPosition.InterestPrincipalFix *= (1 - closePercent); newEodPayPosition.InterestRateDefault = position.InterestRateDefault; newEodPayPosition.InterestSwapInterval = position.InterestSwapInterval; newEodPayPosition.IsAnnualized = position.IsAnnualized; newEodPayPosition.HappenDate = position.HappenDate; newEodPayPosition.Currency = position.Currency; newEodPayPosition.InterestType = position.InterestType; - newEodPayPosition.interest_rest_days = position.interest_rest_days; - newEodPayPosition.interest_rule = position.interest_rule; newEodPayPosition.FloatRate = interests.Count > 0 ? interests.First().FloatRate ?? 0 : 0; newEodPayPosition.FloatRateUnderlyingCode = position.FloatRateUnderlyingCode; newEodPayPosition.InterestFeePending = 0; + newEodPayPosition.interest_rest_days = position.interest_rest_days; + newEodPayPosition.interest_rule = position.interest_rule; //利息端估值用信息 newEodPayPosition.TdInterestPrincipal = interests.Count > 0 ? interests.First().InterestPrincipal : 0; newEodPayPosition.TdInterestPrincipal *= (1 - closePercent); @@ -850,19 +850,17 @@ namespace YLErp.Modules.SwapModule { newEodPayPosition.TdInterestRate = flowEvents.FirstOrDefault()?.InterestRate ?? 0; } - //当日已实现,平仓时已处理 newEodPayPosition.TdInterestFee = flowEvents.Sum(s => s.InterestFee); newEodPayPosition.TdCloseInterestFee = newEodPayPosition.TdInterestFee; + newEodPayPosition.TdCloseInterest = flowEvents.Sum(s => s.InterestClosePnL); if (closePercent == 1) { - newEodPayPosition.TdCloseInterest = eodPayPosition.InterestIncomeSum; newEodPayPosition.InterestIncomeSum = 0; } else { - newEodPayPosition.TdCloseInterest = (eodPayPosition.InterestIncomeSum + TdInterestAmount) * closePercent; - newEodPayPosition.InterestIncomeSum = eodPayPosition.InterestIncomeSum + TdInterestAmount - newEodPayPosition.TdCloseInterest; + newEodPayPosition.InterestIncomeSum = eodPayPosition.InterestIncomeSum + TdInterestAmount - Math.Abs(newEodPayPosition.TdCloseInterest); } //持仓内容-利息腿-损益统计(本方视角) newEodPayPosition.TdInterestIncome = TdInterestAmount * (1 - closePercent); @@ -872,7 +870,7 @@ namespace YLErp.Modules.SwapModule newEodPayPosition.SwapPositionValue = newEodPayPosition.InterestProfitSum + newEodPayPosition.PosiProfitSum; //累计已实现 - newEodPayPosition.RealizedInterest = eodPayPosition.RealizedInterest + newEodPayPosition.TdCloseInterest * ratio; + newEodPayPosition.RealizedInterest = eodPayPosition.RealizedInterest + newEodPayPosition.TdCloseInterest; newEodPayPosition.RealizedInterestFee = eodPayPosition.RealizedInterestFee + newEodPayPosition.TdCloseInterestFee; newEodPayPosition.RealizedPnl = newEodPayPosition.RealizedInterest + newEodPayPosition.RealizedInterestFee; var currencyRate = new EodCurrencyRateService(UserInfo).GetCurrencyRate(td.QuoteCurrency, td.SettlementCurrency, valueDate @@ -1461,19 +1459,9 @@ namespace YLErp.Modules.SwapModule interestPnL += x.InterestProfitSum * ratio; }); eod_Swap.InterestPnL = interestPnL; - decimal tdRealizedPnL = 0; - eodSwapPositions.ForEach(x => - { - decimal ratio = x.InterestDirection == (int)SwapDirectionEnum.收取 ? 1 : -1;//收取为正,支付为负 - if (marginTypes.Contains(x.InterestMode)) - { - ratio = -ratio; - } - tdRealizedPnL += x.TdCloseMtmPnl + x.TdCloseDividend + x.TdCloseFee + x.TdCloseInterest * ratio + x.TdCloseInterestFee; - }); - eod_Swap.TdRealizedPnL = tdRealizedPnL; eod_Swap.PostionValue = eodSwapPositions.Sum(s => s.SwapPositionValue); - eod_Swap.RealizedPnL = eodSwapPositions.Sum(s => s.RealizedMtmPnL + s.RealizedDividend + s.RealizedFee + s.RealizedInterest + s.RealizedInterestFee); + eod_Swap.RealizedPnL = eodSwapPositions.Sum(s => s.RealizedPnl); + eod_Swap.TdRealizedPnL = eod_Swap.RealizedPnL - (preEodSwap?.RealizedPnL ?? 0); eod_Swap.TdCloseQty = positions.Sum(s => s.TdCloseQty); var initMargin = Convert.ToDecimal(tradeSpan?.InitialMargin ?? 0); var maintainMargin = Convert.ToDecimal(tradeSpan?.WorstCastClientPayable ?? 0); diff --git a/YLErpDAL/Modules/SwapModule/SwapTradeAutoService.cs b/YLErpDAL/Modules/SwapModule/SwapTradeAutoService.cs index 12c6ba89..54f3a60a 100644 --- a/YLErpDAL/Modules/SwapModule/SwapTradeAutoService.cs +++ b/YLErpDAL/Modules/SwapModule/SwapTradeAutoService.cs @@ -280,7 +280,7 @@ namespace YLErp.Modules.SwapModule /// 簿记前自动校验 /// /// - public void BookingValidate(List mergeList) + public void BookingValidate(List mergeList,DateTime valueDate) { foreach (var merge in mergeList) { diff --git a/YLErpDAL/Modules/SwapModule/SwapTradeService.cs b/YLErpDAL/Modules/SwapModule/SwapTradeService.cs index ee8c8200..55124b26 100644 --- a/YLErpDAL/Modules/SwapModule/SwapTradeService.cs +++ b/YLErpDAL/Modules/SwapModule/SwapTradeService.cs @@ -253,7 +253,7 @@ namespace YLErp.Modules.SwapModule bool cashNeedAfter = false) { var td = PrepareTrade(flowMerge, client, asset, underlying, clientMarginTemplate?.SwapEndDays??14, structureType); - PrepareTradeExtend(flowMerge, td, underlying, swapFloatRate, clientMarginTemplate); + PrepareTradeExtend(flowMerge, td, underlying, swapFloatRate); td.TradeNumber = BizLogicSingleton.Instance.GenerateTradeNumberBeforeConfirm(td, DbContext); flowMerge.SwapTradeNo = td.TradeNumber; PrepareSwapTrade(td, TradeSourceEnum.系统交易, underlying); @@ -359,7 +359,7 @@ namespace YLErp.Modules.SwapModule /// /// /// - private void PrepareTradeExtend(swap_flow_merge flowMerge, trade td, underlying_manager underlying, SwapFloatRate swapFloatRate, client_marginrate clientMarginTemplate) + private void PrepareTradeExtend(swap_flow_merge flowMerge, trade td, underlying_manager underlying, SwapFloatRate swapFloatRate) { swap_position floatPosition = new swap_position() { @@ -387,53 +387,6 @@ namespace YLErp.Modules.SwapModule UnderlyingInstrumentType = underlying.UnderlyingInstrumentType }; td.swap_positions.Add(floatPosition); - if (clientMarginTemplate != null) - { - decimal initMarginRate = Convert.ToDecimal(clientMarginTemplate.InitMarginRate); - if (td.StructureType != "普通债券类收益互换") - { - if (floatPosition.PositionType == (int)PositionTypeFlag.Long) - { - initMarginRate = clientMarginTemplate.LongInitMarginRate ?? 0; - } - else - { - initMarginRate = clientMarginTemplate.ShortInitMarginRate ?? 0; - } - } - bool year20 = true; - if (underlying.MaturityDate.HasValue && underlying.MaturityDate < DateTime.Now.AddDays(20 * 365)) - { - year20 = false; - } - initMarginRate = year20 ? 0.05m : initMarginRate; - swap_position marginPosition = new swap_position() - { - InterestDirection = (int)SwapDirectionEnum.收取, - InterestRateDefault = clientMarginTemplate.InitMarginRebateRate ?? 0, - InterestMode = (int)InterestModeEnum.初始预付金, - InterestPrincipalFix = initMarginRate * Convert.ToDecimal(td.StockEqvNotional), - HappenDate = td.TradeDate.Value, - PosiMatuirityDate = td.ExerciseDate.Value, - PosiStartDate = td.StartDate.Value, - Currency = "CNY", - IsAnnualized = true, - SwapTradeId = td.id, - IsInitial = true, - OptTime = DateTime.Now, - OptId = UserInfo.UserId, - OptName = UserInfo.UserName, - }; - var marginInterval = new IntervalModel() - { - Date = td.ExerciseDate.Value, - Rate = marginPosition.InterestRateDefault, - Settlement = 0 - }; - List marginIntervalModels = new List() { marginInterval }; - marginPosition.InterestSwapInterval = JsonConvert.SerializeObject(marginIntervalModels); - td.swap_positions.Add(marginPosition); - } swap_position interestPosition = new swap_position() { InterestDirection = flowMerge.BsType == (int)PositionTypeFlag.Long ? (int)SwapDirectionEnum.收取 : (int)SwapDirectionEnum.支付, @@ -818,7 +771,10 @@ namespace YLErp.Modules.SwapModule { throw new ServiceException($"客户'{client.Name}'的'交易资产'属性不包括'权益',不能进行收益互换交易"); } - + if (client.EvaluateExpireDate < req.TradeDate) + { + throw new ServiceException("适当性评估已经过期,只有在适当性有效期内才可以新开仓"); + } req.ClientName = client.Name; req.SettlementCurrency = client.SettlementCurrency; } diff --git a/YLErpWeb/App_Data/FunctionRight.xml b/YLErpWeb/App_Data/FunctionRight.xml index c9878eb5..cdedb7d9 100644 --- a/YLErpWeb/App_Data/FunctionRight.xml +++ b/YLErpWeb/App_Data/FunctionRight.xml @@ -38,8 +38,6 @@ - - @@ -73,27 +71,19 @@ - - - - - - - - @@ -125,7 +115,6 @@ - @@ -139,8 +128,6 @@ - - @@ -160,10 +147,6 @@ - - - - diff --git a/YLErpWeb/App_Data/Menus.txt b/YLErpWeb/App_Data/Menus.txt index f564c05b..dce08627 100644 --- a/YLErpWeb/App_Data/Menus.txt +++ b/YLErpWeb/App_Data/Menus.txt @@ -13,7 +13,6 @@ {Name:"限额监控",Rights:["风险控制-限额监控"],Url:"risk/quotaMonitor"}, {Name:"白名单券池",Rights:["风险控制-白名单券池"],Url:"v3/data/underlying-pool"}, {Name:"日终持仓风险_互换",Rights:["风险控制-日终持仓风险_互换"],Url:"swaptrade2/EodPositionRisks"}, - {Name:"互换预付金监控",Rights:["风险控制-互换预付金监控"],Url:"marginRateSwap/MarginRateSwapMonitorV2"}, {Name:"监控日志",Rights:["风险控制-监控日志"],Url:"RiskCheckLog/Index"}, ] }, @@ -24,18 +23,14 @@ {Name:"收盘操作",Rights:["结算管理-收盘操作"],Url:"eod_trade_value/eodExec"}, {Name:"交易确认书",Rights:["结算管理-交易确认书"],Url:"TradeConfirmBook/Index"}, {Name:"结算确认书",Rights:["结算管理-结算确认书"],Url:"swaptrade2/tradeEndConfirmList"}, - {Name:"资金提示邮件",Rights:["结算管理-资金提示邮件"],Url:"SwapEventEmail/Index"}, {Name:"每日估值报告",Rights:["结算管理-每日估值报告"],Url:"clientbalance/TradeMarketReport"}, ] }, {Name:"客户管理",Rights:["客户管理"],Icon:"menu-icon iconeight" ,SubItems:[ - {Name:"客户等级",Rights:["客户管理-客户等级"],Url:"clientlevel/clientlevelList"}, - {Name:"资信等级",Rights:["客户管理-资信等级"],Url:"credit_rating/credit_ratingList"}, {Name:"开户管理",Rights:["客户管理-开户管理"],Url:"AccountOpeningProcess/clientList"}, {Name:"客户列表",Rights:["客户管理-客户查看"],Url:"client/ClientList"}, {Name:"客户审批",Rights:["客户管理-客户审批"],Url:"clientApproval/openingclientList"}, - {Name:"资信等级有效期",Rights:["客户管理-资信等级有效期"],Url:"client_rating/List"}, {Name:"黑名单客户",Rights:["客户管理-黑名单客户"],Url:"clientblack/clientblacklist"}, {Name:"机构账号设置",Rights:["客户管理-机构账号设置"],Url:"v3/client/account"} ] @@ -59,7 +54,6 @@ }, {Name:"系统管理",Rights:["系统管理"],Icon:"menu-icon iconten" ,SubItems:[ - {Name:"部门架构",Rights:["系统管理-部门管理"],Url:"System/DepartmentView"}, {Name:"角色权限",Rights:["系统管理-角色管理"],Url:"System/RoleIndex"}, {Name:"系统账号",Rights:["系统管理-用户管理"],Url:"System/UserIndex"}, {Name:"簿记账户",Rights:["系统管理-资产单元"],Url:"assetunit/assetunitList"}, diff --git a/YLErpWeb/App_Docs/导入模板/互换预付金率导入模板.xlsx b/YLErpWeb/App_Docs/导入模板/互换预付金率导入模板.xlsx index ca6173bfbc0d9207f4b7eebc0d1f503680dc4b3a..3b3b345e2b5a30e4ed7444bfd1bbc8ff4f71a064 100644 GIT binary patch delta 2193 zcmYLKcRbXOAHG9mk4`x2&e>-c*?W(UOT;C6--+yu&MeBj53)xQDOqQn`<8LVmy(rr zb|qvb<4efb@At>I_g~NJ^*ryt-tXsm$d*->^;CL1thv$=N(%z5(StzjAP^`5Cm$XV zgmnuDz{*AV<6hd%qNWufZ%T>b$+ZNYU$Qu?&LXqcA<5l3AT za_1rE5y`JRE3{an(gh{x=wG|mOE!EdI@k&Sc$ogWsa1}7IbLd@(v)NFXBLGnhmYqy z9sYI9<vZOQWY+Y?H6Ex~Ol14DR1bCU57|jP2lwWYj6Bsw$zuizU){Q-3QaMOE%PoKHpKIm)df4Pvej0w z$01YH>yVH88)=f&}E-Nk3oe z#({|wgt;HWM?yW}`t@_EU6f3Hs|M!V!4VYmJ>k9@e8O1AIm&NfSi$tgusKUtlqe>I zBCAW*V0Nkp?AqC$*F3Hu=1XVVaQKg;^5=^AfDA}(t-_s1+Z#v9@|{rJgD#G{c(O{6 zww*%kOa>Dr8+JdfQUTVC{ce?Go1pbkEP3+oySWKR#cIJ!jy77^a>e{LcekJ_JEM5< zZCu}gy%%m@4Tog~4RWfIad?_%kth1j0--JIf*TYuoels!rRKfcm16qO+fhnqh-{>yPobAJ% zl??jd3Lz&%9@65zLSU;J#c3g(VwP!~5JK2Axe~hXl6=~`Kl#acrdV}6u1Ipnm@|@X z`4h5bQUXdG|HTxoS0jk6D{MYu0Lp10Ko5egNtj8DhUq4oNa-pK2$XsbK(WB^w*sbN zko#K_dpfX9cbrNZ28mK`el$+@U2DOnX1GHXgchQGsQ7uX3aWC(uo>4G7~$lkDkIE} z$r7}exO!tm#!M;>m4^u{B>axPHMl8trzBkY#3*!ux{M>x?J6zH04UQ#C{8R;|YS%4w)`F-5Ubl+qwSaBs`XcMxym zKMPH4VW!9zu0FyB7EEsp4JHn2iAX=M&@q-2!$9N~A6eFgPUym6Z5`FgX(n4^l8bjFhb0u-t(c{;n^ z5kEr|@?18%_W)&3V*=UR<}2zHFxn6eNmZe3v^O9$SQO;8eZ3!Gb-M@XZ*(Azp7z?@Bj#xe&8X4ATeUUJM_vb0`u z%vwra2>PY_5AB9Y#QCNVY>7;a*=ZzCK`;me1swSJ@fE{e<`i8H`UUcWhD=l||2ZR% zCM^hEfY2^D*JGNFFqJo(thN6s)~*I7ZJ&5;wKme4X@B9pQsGxwM|3Hyx71bpx2w;Q zNcs@T)K;?V-LxzN0$j3dutGZ6{ThfBMpUXDXcAzKGdxVKQ{U)q%@Jhg{&#WXePDP$ zv*8E4t%W$vdIfSc56eF)gf^3ItD}L32xJNNP9YT8!3Zm_vRi*WLenogh^wFGqq#5D zI5gxHL_4IKEFGtD4ft?P3aRg=+kDC?%ZQ$aB4({{YMFwJ_+FQ8$wS3^#oyh1H-myt z-AYOdRo4b@UM?7a@xV{9>H3N4?I+xa6?x9QuR6rX*2;wDvL`6w7*eFljf8K|h7Qm9 zrYtBA?YUX%6+7pqT0wCz-U3BYfEX>CuET$7-qH5AeIm*Y2{q(Qz8>wBdqOpSi}K*7 zZpL#W!SIWQ6LA0$&YfHyQD5-$fuvlmmDM=Kw*5D-Io|roS|8ITf3%9d%&Oeeflmv{5X@mIzE^!3? Jn#ljCe*xPH@nir1 delta 2223 zcmY*bX*3iJ7an6LTSLs)&Dh5>W9(ss>_QY{Un-MjUOQPPL}O-T8B2+>WGic9&lbIe z?De6Vc*~Y7*)x*Q*N?aJ-Cxf+_de&`bMJlby%kn3tm@yh;JeSS?Qt*y0OKqG01p5F zhzd}N#D(~K<8c1UQGo%~jw3-2(Y#$(S9OazK~Cg`v_$BMr@B4H**w28tIUtfpNg#a zjTF^Q4O#Qq9XBfbL3QG=mj=Y(}rRj~HHo5(YO0 z5Wt-4WKxEDYpA>-++aqNorm6rvlGeiZJr8kyr6Hvg&9j%&0Ju-*v|$o(&bKeSKYcH zCs^wOsEKv_Kg3;|pEJ#>@mYzBLEP>s3z$TAgj*k%;y;~PIV~@@n>}aZ)gUa`9L$zv zbe-`tT&s3vr-7Heo{RakgvnN_Z@axb(q76@NX_I6K)q*yv%M2wml{1$NagRanF`0? zU*E(noagsMuj^KoNXZiSqiWGN{a0~0j;S;+u|9ZM(k>Mt zh`mk!EFav(;V-89nn%RU zi{CMqDiq`lY54p?2meU0Na?3VtdTVSjF!QgxFLhhYk_P=qFCLFJ>Km!f5B*2Y;5oc z+)S&Fu4w3OVe6^DunSb-lt;7Qw3DuPPF3ywwa%T$_eeY#d3CUT5~71v&JG{g%Y-ZP zG#_h|T2MjjdtR%@v-XD@VLi9X3lZ%ZF4lfiPLHVPmq>tje}NL)Ypq%~658bOh0E|O z>;w)?+DH>mwl&C;yq;UCi`L3_zWqpbwN8j@UUhH#PUarLURy5#(o7v@3@7tgeg6(~_oudatFUL$8h~9Y2!@&q7q7ITcpMgz-|C z4YHsgf4I4gPTlFKX+N(4X<=^Zm8RBoDdUZee^>L# zYca4O^y~W*>-z!y@HJnp9!>@Phpgu>GIQ`Ao>Q8=OHg<~p3*JnoZZM}WGamMruE7U4$FXuA zIVC#!Ng$`v%0lB>RSwCSvr1bYM$RKV4Rgaon$mG*OOkVkK9#M05#)YR^2E&JQYz}f zC!ZgX0*^t7OQ|b`n)GG%0~OB*7Ec2}Mz{}h$awEi`cVJYFxtMdx@Ig|*)6(eE|TpQKc3?G5IVY>ftKI_kDx5MyzFV%s_nf?#69 zld*w>^^yoll+0|2!%;Co4^OjAMaO)tMD3H)uz9O60rw&!Nh^^Ft^w@i42A90RWL*_ zAC1grec*TEJKDJL=DRmic?XLSfr~u`s~1QY@2O7CS(}>{&$3sm^G;b-i#%=a-9(_Z zOCOU}Mz^nF+!q!XjiTdR?)rQ)iNBndzD%`yXK-ZdkZGV~bJV0E(bX*=8`&MSm#{Ov z6QWvsy>xNm6L(#03Vy0|-}whC;J2nSAwWiEWn_SrEE#y`6JyW}m5(4PHi4Ne}5& z5mHZ`5oo)f2V*eX!r_(p5IuuVGULbDXG?kZWjC(Bbs{nSn3Z|o6(2NbP+gbT0yweZ zs^7;|_9*!*X#P4{Xx7wDuaMhzMb^`b*SWos+k>fd-wYh`#0%=qJWLCy_^vXc_NvR8 z-k^)pniCEu#GoBw#D5W2gnt)XUc!oz{ok8UiHF)SF>(L^6a)u^vI^xD{P##JGj{qeYrobRaDS%0c{5$YK0D%8b^eMUkrr3hdQ8r)-!21x&V~8}x uKw1Hqf0~D|JSAJ2SNM0&PqpHGO6B`MYCfe~TAx9M@=F@Zaw7FV*M9+5y6^S? diff --git a/YLErpWeb/App_Docs/导出模板/结算报告模板.xlsx b/YLErpWeb/App_Docs/导出模板/结算报告模板.xlsx index 36ae26dfeb143b2ed10e3f9f6e4f4f8f37ec9641..4c4ea2b29a67625ef9afbee629f17399f7c9e929 100644 GIT binary patch delta 15044 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 Kn5`10fOr5F0CUp- diff --git a/YLErpWeb/App_Docs/导出模板/结算报告模板_浙商.xlsx b/YLErpWeb/App_Docs/导出模板/结算报告模板_浙商.xlsx deleted file mode 100644 index 343eccaaf3d44b7ad80f963d632cc3617d7a31bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19538 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

PX2&+{E=V3er&k0WlZ9$@P`APq$DlJs{;Cd59 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 //模板绑定值,处理四舍五入配置 @@ -853,57 +831,25 @@ namespace YLErp.Web.Controllers { TotalTradeCountSum = pairs["TotalTradeCountSum"], TotalNotionalPrincipalSum = pairs["TotalNotionalPrincipalSum"], - BuyCountSum = pairs["BuyCountSum"], - BuyNominalPrincipalOfTransactionSum = pairs["BuyNominalPrincipalOfTransactionSum"], - SellCountSum = pairs["SellCountSum"], - SellNominalPrincipalOfTransactionSum = pairs["SellNominalPrincipalOfTransactionSum"], TransactionPenNumberSum = pairs["TransactionPenNumberSum"], TodayNotionalPrincipalSum = pairs["TodayNotionalPrincipalSum"], PositionNotionalPrincipalSum = pairs["PositionNotionalPrincipalSum"], CurrentHoldingPenNumberSum = pairs["CurrentHoldingPenNumberSum"], - FreezePremiumSum = pairs["FreezePremiumSum"], - ReceivablesPremiumSum = pairs["ReceivablesPremiumSum"], - FrozenMarginMoneySum = pairs["FrozenMarginMoneySum"], WinLossSum = pairs["WinLossSum"], - PositionPremiumNetCashSum = pairs["PositionPremiumNetCashSum"], PositionPvSum = PS.Config.IsPVRounded ? pairs["RoundedPositionPvSum"] : pairs["PositionPvSum"], PositionPnlSum = PS.Config.IsPVRounded ? pairs["RoundedPositionPnlSum"] : pairs["PositionPnlSum"], TotalAmountSum = PS.Config.IsPVRounded ? pairs["RoundedTotalAmountSum"] : pairs["TotalAmountSum"], NetFundSum = pairs["NetFundSum"], - OptionPremiumSum = pairs["OptionPremiumSum"], - SettlementBalanceSum = pairs["SettlementBalanceSum"], - CouponSum = pairs["CouponSum"], - OptionPremiumSwapSum = pairs["OptionPremiumSwapSum"], - SwapBalanceSum = pairs["SwapBalanceSum"], + NetFundAllSum = pairs["NetFundAllSum"], OtherFundSum = pairs["OtherFundSum"], AmountFundSum = pairs["AmountFundSum"], - GuaranteesTotalAmountSum = pairs["GuaranteesTotalAmountSum"], - HoldingDepositSum = pairs["HoldingDepositSum"], - HoldingDepositASum = pairs["HoldingDepositASum"], - HoldingDepositBSum = pairs["HoldingDepositBSum"], AvailableAmountSum = pairs["AvailableAmountSum"], - CreditUsedSum = pairs["CreditUsedSum"], InsuredAmountSum = pairs["InsuredAmountSum"], - ClosedTradePayableFundSum = pairs["ClosedTradePayableFundSum"], - PositionTradePayableFundSum = pairs["PositionTradePayableFundSum"], - PayableFundSum = pairs["PayableFundSum"], DesirableFundSum = pairs["DesirableFundSum"], - OtherSideMarginSum = pairs["OtherSideMarginSum"], MySideMarginSum = pairs["MySideMarginSum"], - CreditRiskLossSum = pairs["CreditRiskLossSum"], - ExposureSum = pairs["ExposureSum"], - CreditUsedValueSum = pairs["CreditUsedValueSum"], - BuyerPositionMarginSum = pairs["BuyerPositionMarginSum"], - SellerPositionPremiumSum = pairs["SellerPositionPremiumSum"], - ShouldChargedSum = pairs["ShouldChargedSum"], - PFESum = pairs["PFESum"], - EndDesirableFundSum = pairs["EndDesirableFundSum"], - clientEquitySum = pairs["clientEquitySum"], - LastDayPositionPremiumNetCashsSum = pairs["LastDayPositionPremiumNetCashsSum"], - NetFundSumSum = pairs["NetFundSumSum"], - EADSum = pairs["EADSum"], - DaliyPnlSum = PS.Config.IsPVRounded ? pairs["RoundedDaliyPnlSum"] : pairs["DaliyPnlSum"], - AvailableStockEqvNotionalSum= pairs["AvailableStockEqvNotionalSum"], + VmFundSumSum = pairs["VmFundSumSum"], + MarginBalanceSum = pairs["MarginBalanceSum"], + SwapMarketAmountSum = pairs["SwapMarketAmountSum"], InfoList = searchList.rows }; diff --git a/YLErpWeb/Hubs/SwapFlowCombookingHub.cs b/YLErpWeb/Hubs/SwapFlowCombookingHub.cs index 851bd53e..c5300b24 100644 --- a/YLErpWeb/Hubs/SwapFlowCombookingHub.cs +++ b/YLErpWeb/Hubs/SwapFlowCombookingHub.cs @@ -64,7 +64,7 @@ namespace YLErp.Web.Hubs //service.CheckBookByDate(tradeDate); currentStep = "校验簿记前置条件"; await client.SendAsync("ReceiveMessage", currentStep); - service.BookingValidate(mergeList); + service.BookingValidate(mergeList, req.tradeDate); currentStep = "正在合成簿记"; await client.SendAsync("ReceiveMessage", currentStep); //var dmaFlows = swapFlows.Where(x => dmaClientIds.Contains(x.ClientId)).ToList(); diff --git a/YLErpWeb/Views/MarginRateSwap/MarginRateSwapEdit.cshtml b/YLErpWeb/Views/MarginRateSwap/MarginRateSwapEdit.cshtml index 01825430..63b89222 100644 --- a/YLErpWeb/Views/MarginRateSwap/MarginRateSwapEdit.cshtml +++ b/YLErpWeb/Views/MarginRateSwap/MarginRateSwapEdit.cshtml @@ -78,18 +78,13 @@ *

- + %
- - - % -
-
- - + + %
diff --git a/YLErpWeb/Views/WildCard/ClientBalanceReportWildcard.cshtml b/YLErpWeb/Views/WildCard/ClientBalanceReportWildcard.cshtml index 4ac5d27b..ce94d2ac 100644 --- a/YLErpWeb/Views/WildCard/ClientBalanceReportWildcard.cshtml +++ b/YLErpWeb/Views/WildCard/ClientBalanceReportWildcard.cshtml @@ -23,16 +23,7 @@ {{支付截止时间}} - @{ - if (PS.Config.Company == CompanyEnum.浙期) - { - 2020年09月15日上午11:30 - } - else - { - 2020年09月15日上午9:30 - } - } + 2020年09月15日上午11:30 @@ -46,22 +37,17 @@ - {{应付资金总额}} + {{预付金余额}} 548545.26 - - {{大写应付资金总额}} - 伍拾肆万捌仟伍佰肆拾伍元贰角陆分 - - {{发送日期}} 2020-09-14 - {{预付金占用}} + {{初始保证金金额}} 4183.00 @@ -70,33 +56,6 @@ -548545.26 - - {{授信额度}} - 50.00 - - @if (PS.Config.Company != CompanyEnum.中金) - { - - {{应付了结交易款}} - 544362.26 - - - - {{应付存续交易款}} - 0.00 - - - - {{存续交易期权费净额}} - 9557.57 - - - - {{可取资金}} - 80177.03 - - } - {{起始日期}} 2020-09-14 @@ -117,13 +76,10 @@ {{账号}} 309074058888 - @if (PS.Config.Company != CompanyEnum.中金 && !PS.Config.Is国投) - { - - {{期末结存}} + + {{期末结存}} 3622.00 - - } + diff --git a/YLErpWeb/Views/client/clientRiskMonitorBatchSend.cshtml b/YLErpWeb/Views/client/clientRiskMonitorBatchSend.cshtml index 9a442f1d..91e0fbe4 100644 --- a/YLErpWeb/Views/client/clientRiskMonitorBatchSend.cshtml +++ b/YLErpWeb/Views/client/clientRiskMonitorBatchSend.cshtml @@ -24,6 +24,12 @@ var shownType = '@Html.Raw(@ViewBag.ShownType)'; $(function () { $("#setClientBalanceType").val(shownType); + $('#CBContractor').on('changed.bs.select', function () { + changeGetInfo("CB"); + }); + $('#CBContractor').val("1");//默认估值报告接收人 + $('#CBContractor').selectpicker('refresh'); // 刷新 selectpicker,使默认值生效 + $('#CBContractor').trigger('changed.bs.select'); // 手动触发 changed.bs.select 事件 }); var vue = new Vue({ diff --git a/YLErpWeb/Views/clientbalance/TradeMarketClientSend.cshtml b/YLErpWeb/Views/clientbalance/TradeMarketClientSend.cshtml index 7b1f736a..8bbb8b4f 100644 --- a/YLErpWeb/Views/clientbalance/TradeMarketClientSend.cshtml +++ b/YLErpWeb/Views/clientbalance/TradeMarketClientSend.cshtml @@ -240,7 +240,7 @@ !sheets && (sheets = ''); $("[name=sendcontent]").each(function () { let val = $(this).val(); - val !== '账户状况' && $(this).prop('checked', sheets.indexOf(val) >= 0); + $(this).prop('checked', sheets.indexOf(val) >= 0); }); var ue = UE.getEditor('container'); var m_ue = UE.getEditor('margin_container'); diff --git a/YLErpWeb/Views/clientbalance/TradeMarketDescSet.cshtml b/YLErpWeb/Views/clientbalance/TradeMarketDescSet.cshtml index f1a82053..3c7cdba8 100644 --- a/YLErpWeb/Views/clientbalance/TradeMarketDescSet.cshtml +++ b/YLErpWeb/Views/clientbalance/TradeMarketDescSet.cshtml @@ -80,7 +80,7 @@ !sheets && (sheets = ''); $("[name=sendcontent]").each(function () { let val = $(this).val(); - val !== '账户状况' && $(this).prop('checked', sheets.indexOf(val) >= 0); + $(this).prop('checked', sheets.indexOf(val) >= 0); }); } diff --git a/YLErpWeb/Views/clientbalance/TradeMarketReport.cshtml b/YLErpWeb/Views/clientbalance/TradeMarketReport.cshtml index f4628ecf..c485199e 100644 --- a/YLErpWeb/Views/clientbalance/TradeMarketReport.cshtml +++ b/YLErpWeb/Views/clientbalance/TradeMarketReport.cshtml @@ -87,302 +87,69 @@
- @if (PS.Config.Is申万) - { -
- - - - - - - - -
期初结存空头浮动盈利
本日入金客户权益
本日出金期权市值
本日权利金收支应缴纳预付金
行权收益预付金总额
资金结存应追加预付金
可提取预付金
-
- } - else if (PS.Config.Company == CompanyEnum.润和) - { -
- - - - - - - - - -
收支与结存占用与可取盈亏与估值
期初结存预付金占用实现盈亏
出金入金可用资金持仓盈亏
成交收支授信额度持仓市值
了结收支授信占用总资产
其他收支追保金额
期末结存可取资金
质押市值
- - - - - - - -
- } - else if (PS.Config.Company == CompanyEnum.国投) - { -
- - - - - - - - - - - - - - -
收支与结存应付与可取盈亏与估值
期初余额浮动预付金已平仓盈亏
入金权利金收付持仓浮动盈亏
出金可用资金市值权益
当日终止授信额度
期末余额可提取金额
-
- } - else if (PS.Config.Company == CompanyEnum.湘财) - { -
- - - @if (PS.Config.ErpElement.SuppotSnowballSpecialist) - { - - - - - - - - - - - - - - } - else - { - - - - - - - - - - - - - - } - - - - - - - - - @if (PS.Config.Is厦门象屿) - { - - - } - - - - - - - - - - - - - @if (tradeMarketShowTotalNetSettlement) - { - - - - - } -
收支与结存应付与可取盈亏与估值
期初结存预付金占用实现盈亏
出金入金可用资金持仓盈亏
成交收支授信额度
了结收支追保金额
票息可取资金
期初结存预付金占用实现盈亏
出金入金可用资金持仓盈亏
成交收支授信额度持仓市值
了结收支追保金额
票息可取资金
互换成交收支
互换了结收支
其他收支
期末结存阈值 - -
质押市值
总盈亏
- - - - - - -
- } - else if (PS.Config.Company == CompanyEnum.浙商) - { -
- - - - - - - @if (tradeMarketShowTotalNetSettlement) - { - - - - - } -
收支与结存可用与追保盈亏与估值
期初结存保证金占用 已实现盈亏
出金入金可用资金持仓盈亏
其他收支追保金额持仓市值
期末结存可取资金总资产
总盈亏
- - - - - - -
- } - else - { -
- - - @if (PS.Config.ErpElement.SuppotSnowballSpecialist) - { - - - - - - - - - - - - - - } - else - { - - - - - - } - @if (PS.Config.Is东吴) - { - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - } - else - { - - - - - - - - - - - } - @if (tradeMarketShowTotalNetSettlement) - { - - - - - } -
收支与结存应付与可取盈亏与估值
期初结存预付金占用实现盈亏
出金入金可用资金持仓盈亏
成交收支授信额度持仓市值
了结收支应付了结交易款其中:预付金
票息应付存续交易款总资产
期初结存预付金占用实现盈亏
出金入金可用资金持仓盈亏
互换成交收支授信额度持仓市值
互换了结收支应付了结交易款总资产
其他收支应付存续交易款
互换成交收支未结算部分权利金收益
互换了结收支追保金额
其他收支应付资金总额
期末结存可取资金
质押市值期末结存_权利金后付
期末结存追保金额
质押市值应付资金总额
可取资金
总盈亏
- - - - - - -
- } +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
收支与结存可用与追保盈亏与估值
期初结存初始保证金金额已实现盈亏
出金入金预付金余额持仓盈亏
初保账户盯市金额持仓市值
追保账户可用资金总资产
其他收支追保金额
期末结存可取资金
+
- @if (PS.Config.Company == CompanyEnum.浙商) - { - -

1.【期初结存】:观察期初即上期期末的结存;

-

2.【出金入金】:观察区间内的入金(正)和出金(负)的净额;

- @*

3.  【成交收支】:观察区间内衍生品交易生命周期起点的净收入(卖出收入减去买入支出);

*@ - @*

4.  【了结收支】:观察区间内衍生品交易生命周期终点的净收入(了结收入减去了结支出);

*@ -

3.【其他收支】:观察区间内的调整项;

-

4.【期末结存】:期末结存 =  期初结存+出金入金+已实现盈亏+其他收支;

- @*

7.  【质押市值】:抵押的有价证券在观察期末的市值,只可用于抵扣保证金占用,不可抵扣交易款;

*@ -

5.【保证金占用】:根据观察期末的持仓交易按特定算法计算的盯市保证金额,即观察期末不可使用需要暂时冻结的资金;

-

6.【可用资金】:观察期末可用于达成新交易的资金规模,可用资金=期末结存-保证金占用;

- @*

10.【授信额度】:我司在观察期末根据交易对手方的资信情况审慎提供的资金支持额度;

*@ - @*

11.【应付了结交易款】:观察期末尚未结清的了结交易的成交与了结收支净额; 

12.【应付存续交易款】:观察期末尚未结清的存续交易的成交收支;

*@ -

7.【追保金额】:期末结存抵扣保证金占用后不足以抵扣的部分,追保金额=Max(0-可用资金,0);

- @*

14.【应付资金总额】:观察期末交易对手方应入金的资金总额,应付资金总额 = 应付了结交易款 + 应付存续交易款 + 追保金额;

*@ -

8.【可取资金】:扣掉持仓亏损后(持仓盈利则不计算在内),观察期末被占用的可出金取出的资金,可取资金=期末结存-持仓亏损-保证金占用;

-

9.【已实现盈亏】:观察区间内平仓了结交易的盈亏;

-

10.【持仓盈亏】:观察期末存续交易的浮动盈亏;

-

11.【持仓市值】:观察期末存续交易的估值;

-

12.【总  资  产】:观察期末归属交易对手方的资产总额,总资产=期末结存+持仓市值 ;

-
- } - else - { - - @Html.Raw(DBCacheManager.Single.GetStr(CacheTable.DingShiDesc)) - - } + + @Html.Raw(DBCacheManager.Single.GetStr(CacheTable.DingShiDesc)) +
@await Html.PartialAsync("/Views/Common/_importFiles.cshtml", new ImportFileModel() { diff --git a/YLErpWeb/Views/entryexit/entryexitEdit.cshtml b/YLErpWeb/Views/entryexit/entryexitEdit.cshtml index ef07a25d..c1b419d0 100644 --- a/YLErpWeb/Views/entryexit/entryexitEdit.cshtml +++ b/YLErpWeb/Views/entryexit/entryexitEdit.cshtml @@ -49,17 +49,6 @@ - if (PS.Config.Company == CompanyEnum.中金) - { -
- - -
-
- - -
- } if (Model.Direction != ClientCashInCashOut.应收 && !pageObj.isCompanyCash) {
@@ -114,7 +103,13 @@
} - +
+ + +
diff --git a/YLErpWeb/Views/entryexit/entryexitList.cshtml b/YLErpWeb/Views/entryexit/entryexitList.cshtml index 6ff7f3a7..1f2c7aff 100644 --- a/YLErpWeb/Views/entryexit/entryexitList.cshtml +++ b/YLErpWeb/Views/entryexit/entryexitList.cshtml @@ -137,6 +137,12 @@ width: 150, align: 'center', formatter: directionType + }, { + name: 'cash_type', + label: '账户类型', + index: 'cash_type', + width: 150, + align: 'center' }, { name: 'Money', label: '金额', diff --git a/YLErpWeb/Views/entryexit/entryexitView.cshtml b/YLErpWeb/Views/entryexit/entryexitView.cshtml index c6731b81..63e042ee 100644 --- a/YLErpWeb/Views/entryexit/entryexitView.cshtml +++ b/YLErpWeb/Views/entryexit/entryexitView.cshtml @@ -66,6 +66,7 @@ @Html.MyDisplayFor(m => m.Number) @Html.MyDisplayFor(m => m.ClientName) @Html.MyDisplayFor(m => m.DirectionType) + @Html.MyDisplayFor(m => m.cash_type) @Html.MyDisplayFor(m => m.Money, (((Model.Direction == "出金" ? (-1) : 1) * Model.Money) ?? 0).ToString("N")) @Html.MyDisplayFor(m => m.CurrencyCode) @Html.MyDisplayFor(m => m.HappenDate, Utilities.ShowValidDatetime(Model.HappenDate, "yyyy-MM-dd HH:mm:ss")) diff --git a/YLErpWeb/YLErpWeb.csproj b/YLErpWeb/YLErpWeb.csproj index c8392917..ec0d8db9 100644 --- a/YLErpWeb/YLErpWeb.csproj +++ b/YLErpWeb/YLErpWeb.csproj @@ -112,7 +112,7 @@ PreserveNewest - + PreserveNewest @@ -179,8 +179,8 @@ <_AppFiles Remove="App_Docs\导出模板\浮动利率特殊设置导出模板.xlsx" /> <_AppFiles Remove="App_Docs\导出模板\浮动利率默认设置导出模板.xlsx" /> <_AppFiles Remove="App_Docs\导出模板\结算报告标准模板_湘财.xlsx" /> + <_AppFiles Remove="App_Docs\导出模板\结算报告模板.xlsx" /> <_AppFiles Remove="App_Docs\导出模板\结算报告模板_山西固收.xlsx" /> - <_AppFiles Remove="App_Docs\导出模板\结算报告模板_浙商.xlsx" /> <_AppFiles Remove="App_Docs\导出模板\结算报告模板_湘财.xlsx" /> <_AppFiles Remove="App_Docs\导入模板\导入限额指标.xlsx" /> <_AppFiles Remove="App_Docs\导入模板\批量对冲波动率模板.xlsx" /> diff --git a/YLErpWeb/wwwroot/Scripts/app/client/clientRiskMonitor.js b/YLErpWeb/wwwroot/Scripts/app/client/clientRiskMonitor.js index fa168b7b..7e328f96 100644 --- a/YLErpWeb/wwwroot/Scripts/app/client/clientRiskMonitor.js +++ b/YLErpWeb/wwwroot/Scripts/app/client/clientRiskMonitor.js @@ -141,12 +141,6 @@ function setHoldingDepositFunc() { function getColModelGrid() { - function KeShangYuEr(cellValue, options, rowObject) { - return ((parseFloat(rowObject.NetFund) || 0) + (parseFloat(rowObject.WinLoss) || 0)).toFixed(2); - } - - var isHaiTong = page.Company === "海通"; - var colModelGrid = [ { name: 'id', label: 'id', index: 'id', width: 1, align: 'left', hidden: true, @@ -158,12 +152,6 @@ function getColModelGrid() { name: 'Number', label: '客户编号', index: 'Number', width: 100, align: 'center', frozen: true }, { name: 'Name', label: '客户名称', index: 'Name', width: 238, align: 'center', frozen: true - }, { - name: 'ProtocolSignDate', label: '商品类签署日期', index: 'ProtocolSignDate', width: 150, align: 'center', formatter: 'date', hidden: true, frozen: true - }, { - name: 'RightProtocolSignDate', label: '权益类签署日期', index: 'RightProtocolSignDate', width: 150, align: 'center', formatter: 'date', hidden: true, frozen: true - },{ - name: 'licenseCodes', label: '统一社会信用代码', index: 'licenseCodes', width: 100, align: 'right', frozen: true },{ name: 'TotalTradeCount', label: '交易总数', index: 'TotalTradeCount', width: 120, align: 'center', formatter: main.toInt, sorttype: 'number' }, { @@ -176,65 +164,42 @@ function getColModelGrid() { name: 'PositionNotionalPrincipal', label: '持仓名义本金', index: 'PositionNotionalPrincipal', width: 120, align: 'right', formatter: 'number', sorttype: 'number' }, { name: 'CurrentHoldingPenNumber', label: '持仓笔数', index: 'CurrentHoldingPenNumber', width: 80, align: 'center', formatter: main.toInt, sorttype: 'number' - }, { - name: 'FreezePremium', label: '应付冻结权利金', index: 'FreezePremium', width: 100, align: 'right', formatter: 'number', hidden: true, sorttype: 'number' - }, { - name: 'ReceivablesPremium', label: '应收冻结权利金', index: 'ReceivablesPremium', width: 100, align: 'right', formatter: 'number', hidden: true, sorttype: 'number' - }, { - name: 'FrozenMarginMoney', label: '冻结预付金', index: 'FrozenMarginMoney', width: 100, align: 'right', formatter: 'number', hidden: true, sorttype: 'number' }, { name: 'WinLoss', label: '实现盈亏', index: 'WinLoss', width: 120, align: 'right', value: '0', formatter: 'number', sorttype: 'number' }, { - name: 'PositionPv', label: '持仓市值', index: 'PositionPv', width: 120, align: 'right', value: '0', formatter: 'number', optionHide: page.isPvRounded, hidden: page.isPvRounded, sorttype: 'number' - }, { - name: 'RoundedPositionPv', label: '持仓市值', index: 'RoundedPositionPv', width: 120, align: 'right', value: '0', formatter: 'number', optionHide: !page.isPvRounded, hidden: !page.isPvRounded, sorttype: 'number' - }, { - name: 'PrepaymentAmount', label: '其中:预付金', index: 'PrepaymentAmount', width: 120, align: 'right', value: '0', formatter: 'number', optionHide: !page.SuppotSnowballSpecialist, hidden: !page.SuppotSnowballSpecialist, sorttype: 'number' + name: 'RoundedPositionPv', label: '持仓市值', index: 'RoundedPositionPv', width: 120, align: 'right', value: '0', formatter: 'number', sorttype: 'number' }, { name: 'PositionPnl', label: '持仓盈亏', index: 'PositionPnl', width: 120, align: 'right', value: '0', formatter: 'number', optionHide: page.isPvRounded, hidden: page.isPvRounded, sorttype: 'number' - }, { - name: 'DaliyPnl', label: '当日盈亏', index: 'DaliyPnl', width: 120, align: 'right', value: '0', formatter: 'number', optionHide: page.isPvRounded, hidden: page.isPvRounded, sorttype: 'number' }, { name: 'RoundedPositionPnl', label: '持仓盈亏', index: 'RoundedPositionPnl', width: 120, align: 'right', value: '0', formatter: 'number', optionHide: !page.isPvRounded, hidden: !page.isPvRounded, sorttype: 'number' }, { - name: 'RoundedDaliyPnl', label: '当日盈亏', index: 'RoundedDaliyPnl', width: 120, align: 'right', value: '0', formatter: 'number', optionHide: !page.isPvRounded, hidden: !page.isPvRounded, sorttype: 'number' + name: 'NetFundAll', label: '出金入金', index: 'NetFundAll', width: 100, align: 'right', formatter: 'number', sorttype: 'number' }, { - name: 'NetFund', label: '出金入金', index: 'NetFund', width: 100, align: 'right', formatter: 'number', sorttype: 'number' + name: 'NetFund', label: '初保账户', index: 'NetFund', width: 100, align: 'right', formatter: 'number', sorttype: 'number' }, { - name: 'OptionPremiumSwap', label: '互换成交收支', index: 'OptionPremiumSwap', width: 100, align: 'right', formatter: 'number', sorttype: 'number' - }, { - name: 'SwapBalance', label: '互换了结收支', index: 'SwapBalance', width: 100, align: 'right', formatter: 'number', sorttype: 'number' + name: 'VmFundSum', label: '追保账户', index: 'VmFundSum', width: 100, align: 'right', formatter: 'number', sorttype: 'number' }, { name: 'OtherFund', label: '其他收支', index: 'OtherFund', width: 100, align: 'right', formatter: 'number', sorttype: 'number' }, { name: 'AmountFund', label: '期末结存', index: 'AmountFund', width: 100, align: 'right', formatter: 'number', sorttype: 'number' - }, { - name: 'GuaranteesTotalAmount', label: '质押市值', index: 'GuaranteesTotalAmount', width: 100, align: 'right', formatter: 'number', sorttype: 'number' }, { name: 'TotalAmount', label: '总资产', index: 'TotalAmount', width: 100, align: 'right', formatter: 'number', optionHide: page.isPvRounded, hidden: page.isPvRounded, sorttype: 'number' }, { name: 'RoundedTotalAmount', label: '总资产', index: 'RoundedTotalAmount', width: 100, align: 'right', formatter: 'number', optionHide: !page.isPvRounded, hidden: !page.isPvRounded, sorttype: 'number' }, { - name: 'HoldingDeposit', label: '预付金占用', index: 'HoldingDeposit', width: 120, align: 'right', formatter: holdingDepositFormat, sorttype: 'number' + name: 'MySideMargin', label: '初始保证金金额', index: 'MySideMargin', width: 120, align: 'right', formatter: 'number', sorttype: 'number' + }, { + name: 'MarginBalance', label: '预付金余额', index: 'MarginBalance', width: 120, align: 'right', formatter: 'number', sorttype: 'number' + }, { + name: 'SwapMarketAmount', label: '盯市金额', index: 'SwapMarketAmount', width: 120, align: 'right', formatter: 'number', sorttype: 'number' + }, { + name: 'SwapMarketAmountPercent', label: '履约保证金比例', index: 'SwapMarketAmountPercent', width: 120, align: 'right', formatter: percentFormat, sorttype: 'number' }, { name: 'AvailableAmount', label: '可用资金', index: 'AvailableAmount', width: 120, align: 'right', formatter: 'number', sorttype: 'number' - }, { - name: 'CreditUsed', label: '授信使用率', index: 'CreditUsed', width: 120, align: 'right', formatter: percentFormat, sorttype: 'number' }, { name: 'InsuredAmount', label: '追保金额', index: 'InsuredAmount', width: 120, align: 'right', value: '0', formatter: 'number', sorttype: 'number' - }, { - name: 'ClosedTradePayableFund', label: '应付已了结交易款', index: 'ClosedTradePayableFund', width: 120, align: 'right', value: '0', formatter: 'number', sorttype: 'number' - }, { - name: 'PositionTradePayableFund', label: '应付未了结交易款', index: 'PositionTradePayableFund', width: 100, align: 'right', formatter: 'number', sorttype: 'number' - }, { - name: 'PayableFund', label: '应付资金总额', index: 'PayableFund', width: 100, align: 'right', formatter: 'number', sorttype: 'number' }, { name: 'DesirableFund', label: '可取资金', index: 'DesirableFund', width: 100, align: 'right', formatter: 'number', sorttype: 'number' - }, - { - name: 'CreditUsedValue', label: '授信使用金额', index: 'CreditUsedValue', width: 100, align: 'right', formatter: 'number', sorttype: 'number' - }, { - name: 'AvailableStockEqvNotional', label: '可用名义本金规模', index: 'AvailableStockEqvNotional', width: 180, align: 'right', formatter: 'number', hidden: !page.UseClientStockEqvNotional, optionHide: !page.UseClientStockEqvNotional, sorttype: 'number' } ]; colModelGrid.push({ @@ -300,17 +265,14 @@ function gridComplete() { var sum = arguments[0].Sum; $("#listGrid").footerData("set", { Number: "合计", TotalTradeCount: sum.TotalTradeCountSum, TotalNotionalPrincipal: sum.TotalNotionalPrincipalSum, - BuyCount: sum.BuyCountSum, BuyNominalPrincipalOfTransaction: sum.BuyNominalPrincipalOfTransactionSum, SellCount: sum.SellCountSum, - SellNominalPrincipalOfTransaction: sum.SellNominalPrincipalOfTransactionSum, TransactionPenNumber: sum.TransactionPenNumberSum, + TransactionPenNumber: sum.TransactionPenNumberSum, TodayNotionalPrincipal: sum.TodayNotionalPrincipalSum, PositionNotionalPrincipal: sum.PositionNotionalPrincipalSum, CurrentHoldingPenNumber: sum.CurrentHoldingPenNumberSum, - FreezePremium: sum.FreezePremiumSum, ReceivablesPremium: sum.ReceivablesPremiumSum, FrozenMarginMoney: sum.FrozenMarginMoneySum, - WinLoss: sum.WinLossSum, PositionPremiumNetCash: sum.PositionPremiumNetCashSum, PositionPv: sum.PositionPvSum, PositionPnl: sum.PositionPnlSum, RoundedPositionPv: sum.RoundedPositionPvSum, RoundedPositionPnl: sum.RoundedPositionPnlSum, DaliyPnl: sum.DaliyPnlSum, - NetFund: sum.NetFundSum,Coupon: sum.CouponSum, OptionPremiumSwap: sum.OptionPremiumSwapSum, SwapBalance: sum.SwapBalanceSum, OtherFund: sum.OtherFundSum, - AmountFund: sum.AmountFundSum, GuaranteesTotalAmount: sum.GuaranteesTotalAmountSum, TotalAmount: sum.TotalAmountSum, RoundedTotalAmount: sum.RoundedTotalAmountSum, HoldingDeposit: sum.HoldingDepositSum, HoldingDepositA: sum.HoldingDepositASum, HoldingDepositB: sum.HoldingDepositBSum, + WinLoss: sum.WinLossSum, PositionPv: sum.PositionPvSum, PositionPnl: sum.PositionPnlSum, RoundedPositionPv: sum.RoundedPositionPvSum, RoundedPositionPnl: sum.RoundedPositionPnlSum, + NetFund: sum.NetFundSum, OtherFund: sum.OtherFundSum, + AmountFund: sum.AmountFundSum, TotalAmount: sum.TotalAmountSum, RoundedTotalAmount: sum.RoundedTotalAmountSum, AvailableAmount: sum.AvailableAmountSum, InsuredAmount: sum.InsuredAmountSum, - ClosedTradePayableFund: sum.ClosedTradePayableFundSum, PositionTradePayableFund: sum.PositionTradePayableFundSum, PayableFund: sum.PayableFundSum, DesirableFund: sum.DesirableFundSum, - PFE: sum.PFESum, EAD: sum.EADSum, EndDesirableFund: sum.EndDesirableFundSum, LastDayPositionPremiumNetCashs: sum.LastDayPositionPremiumNetCashsSum, - NetFundSumString: sum.NetFundSumSum, clientEquity: sum.clientEquitySum + DesirableFund: sum.DesirableFundSum, NetFundAll: sum.NetFundAllSum, VmFundSum: sum.VmFundSumSum, MySideMargin: sum.MySideMarginSum, + MarginBalance: sum.MarginBalanceSum, SwapMarketAmount: sum.SwapMarketAmountSum }); } g_grid = jQuery('#listGrid'); @@ -355,9 +317,9 @@ function LoadGrid() { jQuery('#listGrid').jqGrid('setGroupHeaders', { useColSpanStyle: true, groupHeaders: [ - { startColumnName: 'Number', numberOfColumns: 17, titleText: '客户信息' }, - { startColumnName: 'TotalTradeCount', numberOfColumns: 23, titleText: '交易信息 ' }, - { startColumnName: 'NetFund', numberOfColumns: 37, titleText: '账户状况' } + { startColumnName: 'Number', numberOfColumns: 2, titleText: '客户信息' }, + { startColumnName: 'TotalTradeCount', numberOfColumns: 10, titleText: '交易信息 ' }, + { startColumnName: 'NetFundAll', numberOfColumns: 14, titleText: '账户状况' } ] }); } diff --git a/YLErpWeb/wwwroot/Scripts/app/client/entryexitEdit.js b/YLErpWeb/wwwroot/Scripts/app/client/entryexitEdit.js index 76096464..c4b260ea 100644 --- a/YLErpWeb/wwwroot/Scripts/app/client/entryexitEdit.js +++ b/YLErpWeb/wwwroot/Scripts/app/client/entryexitEdit.js @@ -203,9 +203,7 @@ function saveentryexit() { function setDirection(isInit) { !isInit && cardInputMgr.changeInputType(true); - let direction = $("#Direction").val(); - $(".changeInputBtn").toggleClass("hide", ["出金", "应付"].includes(direction)); cardInputMgr.toggle(["入金", "出金"].includes(direction)); diff --git a/YLErpWeb/wwwroot/Scripts/app/client/tradeMarketReport.js b/YLErpWeb/wwwroot/Scripts/app/client/tradeMarketReport.js index db1699ad..10f850c5 100644 --- a/YLErpWeb/wwwroot/Scripts/app/client/tradeMarketReport.js +++ b/YLErpWeb/wwwroot/Scripts/app/client/tradeMarketReport.js @@ -302,100 +302,21 @@ function SearchClientBalance() { main.post("/trade_span/GetClientLatestBalance", { clientId: $("#ClientId").val(), ValueDateFrom: param.ValueDateStart, ValueDateTo: param.ValueDateEnd, IsClientBalanceGap: param.IsClientBalanceGap, IsGetOuterMarginGap: param.IsGetOuterMarginGap, ParentFlag: param.ParentFlag }).done(function (data) { $("#LastDayRemainFund").text(numFormart(data.LastDayRemainFund)); - $("#CashInCashOutChange").text(numFormart(data.NetFund)); - $("#CashInChange").text(numFormart(data.InFund)); - $("#CashOutChange").text(numFormart(data.OutFund)); - $("#OptionPremium").text(numFormart(data.OptionPremium));//成交支出 - $("#OptionPremiumSwap").text(numFormart(data.OptionPremiumSwap)); - $("#OtherFund").text(numFormart(data.OtherFund)); - $("#SettlementBalance").text(numFormart(data.SettlementBalance));//了解支出 - $("#Coupon").text(numFormart(data.Coupon)); - $("#SwapBalance").text(numFormart(data.SwapBalance)); - $("#OptionPremiumAndUnwindBalance").text(numFormart(data.OptionPremiumAndUnwindBalanceTotal)); - $("#ExerciseBalance").text(numFormart(data.ExerciseBalance)); - $("#ToDayRemainFund").text(numFormart(data.AmountFund)); - $("#TodayRemianFundProduct").text(numFormart(data.GuaranteesTotalAmount)); - $("#WorstCastClientPayable").text(numFormart(data.MinusPayableMarginTotal)); - $("#WorstCastClientPayable").val(numFormart(data.MinusPayableMarginTotal)); - $("#PositionPremium").text(numFormart(-data.PositionPremiumNetCash)); - $("#EndDesirableFund").text(numFormart(data.EndDesirableFund)); - if (data.IsPayableMarginManual || data.ClientBalanceGap) { - $("#WorstCastClientPayable").css("border-color", "red"); - } - else { - $("#WorstCastClientPayable").css("border-color", "initial"); - } - if (data.IsPayableMarginLock && canUpdatePayableMargin) { - $("#unlock").show(); - } - else { - $("#unlock").hide(); - } - - $("#TotalMargin").text(numFormart(data.TotalMarginTotal)); - $("#Credit").text(numFormart(data.TotalCredit)); - + $("#MySideMargin").text(numFormart(data.MySideMargin)); $("#WinLoss").text(numFormart(data.WinLoss)); - $("#PositionPremiumNetCash").text(numFormart(data.PositionPremiumNetCash)); - $("#Pv").text(numFormart(isPvRounded ? data.RoundedPositionPv : data.PositionPv)); + $("#CashInCashOutChange").text(numFormart(data.NetFundAll)); + $("#MarginBalance").text(numFormart(data.MarginBalance)); $("#PositionPnl").text(numFormart(isPvRounded ? data.RoundedPositionPnl : data.PositionPnl)); - $("#PrepaymentAmount").text(numFormart(data.PrepaymentAmount)); - $("#Amount").text(numFormart(isPvRounded ? data.RoundedTotalAmountTotal : data.TotalAmountTotal)); - $("#Margin").text(numFormart(data.MarginByPayableMarginTotal)); - $("#ClosedTradePayableFund").text(numFormart(data.ClosedTradePayableFundTotal)); + $("#NetFundAll").text(numFormart(data.NetFund)); + $("#SwapMarketAmount").text(numFormart(data.SwapMarketAmount)); + $("#Pv").text(numFormart(isPvRounded ? data.RoundedPositionPv : data.PositionPv)); + $("#VmFundSum").text(numFormart(data.VmFundSum)); + $("#AvailableFund").text(numFormart(data.AvailableAmount)); + $("#OtherFund").text(numFormart(data.OtherFund)); $("#PositionTradePayableFund").text(numFormart(data.PositionTradePayableFundTotal)); - - if (isGuoTou) { - $("#ToEndBalance").text(numFormart(data.ToEndBalance)); - $("#WinLossSum").text(numFormart(data.WinLossSum)); - $("#AmountFundWithPositionPnl").text(numFormart(data.AmountFundWithPositionPnl)); - $("#OptionPremiumAndSwapSum").text(numFormart(data.OptionPremiumAndSwapSum)); - } - - if (isRunHe) { - //东证界面上没有这个,追保用追保金额计算 - $("#PayableFund").val(numFormart(data.MarginByPayableMarginTotal)); - //东证有授信占用 - $("#CreditOccupy").text(numFormart(Math.min(data.TotalCredit, Math.max(data.MinusPayableMarginTotal - data.AmountFund, 0)))); - $("#AvailableFund").text(numFormart(data.AvailableAmount + data.TotalCredit)); - $("#DesirableFund").text(numFormart(Math.max(data.AvailableAmount, 0))); - } else { - $("#PayableFund").val(numFormart(data.PayableFundTotal)); - $("#AvailableFund").text(numFormart(data.AvailableAmount)); - $("#DesirableFund").text(numFormart(data.DesirableFundTotal)); - } - $("#SellTradePrice").text(numFormart(data.SellTradePrice)); - $("#ClientSellPositionPnl").text(numFormart(data.ClientSellPositionPnl)); - - $("#TotalNetSettlement").text(numFormart(data.TotalNetSettlementTotal)); - - $("#IsTradeCredit").val(data.IsTradeCredit); - $("#TotalCredit").val(data.TotalCredit); - $("#MarginBalance").val(data.MarginBalance); - $("#FrozenMarginMoney").val(data.FrozenMarginMoney); - $("#FrozenRedeemFunds").val(numFormart(data.FrozenRedeemFunds)); - $("#FundThreshold").val(data.FundThreshold); - - if (!data.IsLatestDate) { - $("#latestDataTip").show(); - } - else { - $("#latestDataTip").hide(); - } - - //定制需求 #TRS-ZS-144 每日估值报告字段调整 - if (ylotc.Company == '浙商') { - //保证金占用- 浙商 经过沟通,取值沿用-预付金占用 - $("#NoccupyMargin").text(numFormart(data.MinusPayableMarginTotal)); - //期末结存 = 期初结存+出金入金+已实现盈亏+其他收支 (经过产品沟通,取原理的期末结存值,描述不变更) - $("#ToDayRemainFund").text(numFormart(data.AmountFund)); - //可用资金=期末结存-保证金占用; - $("#AvailableFund").text(numFormart(data.AmountFund - data.MinusPayableMarginTotal)); - //可取资金 = 期末结存 - 持仓亏损 - 保证金占用; 产品沟通调整:可取资金=期末结存-保证金占用+ Min(0,持仓盈亏) - $("#Margin").text(numFormart(data.AmountFund - data.MinusPayableMarginTotal + Math.min(0, isPvRounded ? data.RoundedPositionPnl : data.PositionPnl))); - //总资产=期末结存+持仓市值 ; - $("#Amount").text(numFormart(isPvRounded ? data.RoundedPositionPv + data.AmountFund : data.PositionPv + data.AmountFund)); - } + $("#ToDayRemainFund").text(numFormart(data.AmountFund)); + $("#DesirableFund").text(numFormart(data.DesirableFundTotal)); + $("#Amount").text(numFormart(data.SwapMarketAmount)); }); var data = { clientId: $("#ClientId").val(), ValueDateFrom: $("#ValueDateFrom").val(), ValueDateTo: $("#ValueDate").val() }; diff --git a/YLErpWeb/wwwroot/Scripts/app/marginRate/marginRateSwapList.js b/YLErpWeb/wwwroot/Scripts/app/marginRate/marginRateSwapList.js index 09ad9659..91cab8dc 100644 --- a/YLErpWeb/wwwroot/Scripts/app/marginRate/marginRateSwapList.js +++ b/YLErpWeb/wwwroot/Scripts/app/marginRate/marginRateSwapList.js @@ -158,11 +158,9 @@ const jqgrid1Mgr = (new function () { return cellValue + "天"; } }, { - name: 'InitMarginRate', label: '期初预付金', index: 'InitMarginRate', formatter: percentFormat + name: 'InitMarginRate', label: '初始保证金率', index: 'InitMarginRate', formatter: percentFormat }, { - name: 'InitMarginRebateRate', label: '期初预付金利率', index: 'InitMarginRebateRate', formatter: percentFormat, - }, { - name: 'AddToMarginRebateRate', label: '追加预付金利率', index: 'AddToMarginRebateRate', formatter: percentFormat, + name: 'MaintenanceRate', label: '维持保证金率', index: 'MaintenanceRate', formatter: percentFormat, }, { name: 'OptName', label: '操作人', index: 'OptName' }, {