using Confluent.Kafka; using DocumentFormat.OpenXml.Spreadsheet; using Microsoft.AspNetCore.Authorization; using Org.BouncyCastle.Ocsp; using System.Text.RegularExpressions; using YLErp.BLL.Eod; using YLErp.DBModels; using YLErp.DBModels.Consts; using YLErp.Enums; using YLErp.Modules.ClientModule; using YLErp.Modules.EodModule.QueryModule; using YLErp.Modules.ReportModule; using YLErp.Modules.ReportModule.SettlementReportModule; using YLErp.Modules.TradeModule; using YLErp.Modules.TradeModule.SwapModule; namespace YLErp.Web.Controllers { public class clientbalanceController : BaseController { readonly IViewRenderService _viewRenderer; public UserInfo reportUser { get; set; } public clientbalanceController(IViewRenderService viewRenderer) { _viewRenderer = viewRenderer; } [MyAuthorize("结算管理-每日估值报告")] public ActionResult TradeMarketReport(int? clientId, string startTime, string endTime, bool? ParentFlag = false) { ViewBag.ClientId = clientId; ViewBag.StartTime = startTime; ViewBag.EndTime = endTime; ViewBag.ParentFlag = ParentFlag; return View(); } public ActionResult TradeMarketReportConfigure() { return View(); } public ActionResult TradeMarketReportConfigureImport() { return View(); } public ActionResult TradeMarketReportConfigureEdit(string enid) { var id = DecryptInt(enid); if (id == 0) { return View(new TradeMarketReportConfigure()); } var tradeMarketReportConfigure = yldb.tradeMarketReport_Configure.Find(id); return View(tradeMarketReportConfigure); } [HttpPost] public ActionResult GetTradeMarketReportConfigureList(TradeMarketReportConfigureService.TradeMarketReportConfigureReq req) { var sList = new TradeMarketReportConfigureService(this.CurUser).SearchList(req); var clientDb = new ClientDBContext(); foreach (var item in sList.rows) { if (item.ClientId != null) { item.ClientName = clientDb.client.Where(c => c.id == item.ClientId).Select(n => n.Name).FirstOrDefault(); } else { item.ClientName = "全部"; } } return Json(sList); } [HttpPost] public ActionResult TradeMarketReportConfigureEditJson(TradeMarketReportConfigure req) { new TradeMarketReportConfigureService(this.CurUser).SaveTradeMarketReportConfigure(req); return JsonSuccess("已修改"); } public ActionResult TradeMarketReportConfigureDelete(string enid) { var id = DecryptInt(enid); new TradeMarketReportConfigureService(this.CurUser).DeleteTradeMarketReportConfigure(id); return JsonSuccess("已删除"); } public JsonResult ImportMarketReportConfigure(IFormFile file) { try { if (!file.FileName.EndsWith("xlsx")) { return JsonError("文件格式不对,请使用xlsx文件"); } using (var inputStream = file.OpenReadStream()) { var result = new TradeMarketReportConfigureService(CurUser).ImportTradeMarketReportConfigure(inputStream); if (result.IsSuccess) { return JsonSuccess("导入成功"); } return JsonError(result.Message); } } catch (Exception ex) { LogFactory.GetLogger(nameof(ClientController)).Error("ImportMarketReportConfigure", ex); return JsonError(ex.Message); throw; } } [MyAuthorize("结算管理-信用风险")] public ActionResult ClientCreditRisk() { return View(); } [MyAuthorize("结算管理-信用风险")] public JsonResult ClientCreditRiskeQuery(ClientCreditRiskReq req) { req.CurUserClientIds = CurUser.GetClientIdsByCurUser(true); var slist = new ClientCreditRiskService(CurUser).clientCreditRisksQuery(req); return Json(slist); } [MyAuthorize("结算管理-信用风险")] public ActionResult ClientMailTemplateSet() { return View(); } [MyAuthorize("结算管理-每日估值报告")] public ActionResult TradeMarketReport_BalanceStatement(int? clientId, string startTime, string endTime, bool ParentFlag) { ViewBag.ClientId = clientId; ViewBag.StartTime = startTime; ViewBag.EndTime = endTime; ViewBag.ParentFlag = ParentFlag; return View(); } [MyAuthorize("结算管理-每日估值报告")] public ActionResult TradeMarketReport_Collateral(int? clientId, string startTime, string endTime, bool ParentFlag) { ViewBag.ClientId = clientId; ViewBag.StartTime = startTime; ViewBag.EndTime = endTime; ViewBag.ParentFlag = ParentFlag; return View(); } [MyAuthorize("结算管理-每日估值报告")] public ActionResult TradeMarketReport_HistoricalPosition(int? clientId, string startTime, string endTime, bool ParentFlag) { ViewBag.ClientId = clientId; ViewBag.StartTime = startTime; ViewBag.EndTime = endTime; ViewBag.ParentFlag = ParentFlag; return View(); } [MyAuthorize("结算管理-每日估值报告")] public ActionResult TradeMarketReport_HistoricalPositionSwap(int? clientId, string startTime, string endTime, bool ParentFlag) { ViewBag.ClientId = clientId; ViewBag.StartTime = startTime; ViewBag.EndTime = endTime; ViewBag.ParentFlag = ParentFlag; return RedirectToRoute(new { controller = "swaptrade2", //控制器 action = "TradeMarketReport_HistoricalPositionSwapFlow", //Action clientId = clientId, //参数 startTime = startTime, //参数 endTime = endTime, }); } /// /// 持仓明细 /// /// /// /// /// /// [MyAuthorize("结算管理-每日估值报告")] public ActionResult TradeMarketReport_PositionDetails(int? clientId, string startTime, string endTime, bool ParentFlag) { ViewBag.ClientId = clientId; ViewBag.StartTime = startTime; ViewBag.EndTime = endTime; ViewBag.ParentFlag = ParentFlag; return View(); } [MyAuthorize("结算管理-每日估值报告")] public ActionResult TradeMarketReport_PositionDetailsSwap(int? clientId, string startTime, string endTime, bool ParentFlag) { ViewBag.ClientId = clientId; ViewBag.StartTime = startTime; ViewBag.EndTime = endTime; ViewBag.ParentFlag = ParentFlag; return RedirectToRoute(new { controller = "swaptrade2", //控制器 action = "TradeMarketReport_PositionSwapFlow", //Action clientId = clientId, //参数 startTime = startTime, //参数 endTime = endTime, }); } [MyAuthorize("结算管理-每日估值报告")] public object ExportClientCashRemian(DateTime reportDate) { var bytes = new SettlementReportForZJService(CurUser).exportClientCashRemian(reportDate); return File(bytes, xlsxMimeType, $"客户资金余额导出-{DateTime.Now:yyyy-MM-dd}.xlsx"); } #region 结算管理-每日估值报告 国君互换 [MyAuthorize("结算管理-每日估值报告")] public ActionResult TradeMarketReport_PositionSwapFlow(int? clientId, string startTime, string endTime, bool ParentFlag) { ViewBag.ClientId = clientId; ViewBag.StartTime = startTime; ViewBag.EndTime = endTime; ViewBag.ParentFlag = ParentFlag; return RedirectToRoute(new { controller = "swaptrade2", //控制器 action = "TradeMarketReport_PositionSwapFlow", //Action clientId = clientId, //参数 startTime = startTime, //参数 endTime= endTime, }); } [MyAuthorize("结算管理-每日估值报告")] public ActionResult TradeMarketReport_HistoricalPositionSwapFlow(int? clientId, string startTime, string endTime, bool ParentFlag) { ViewBag.ClientId = clientId; ViewBag.StartTime = startTime; ViewBag.EndTime = endTime; ViewBag.ParentFlag = ParentFlag; return RedirectToRoute(new { controller = "swaptrade2", //控制器 action = "TradeMarketReport_HistoricalPositionSwapFlow", //Action clientId = clientId, //参数 startTime = startTime, //参数 endTime = endTime, }); } [HttpPost] public JsonResult tradeHistorySwapFlowQuery(TradeReq req) { var tss = new TradeSwapService(CurUser); var sList = tss.SearchFlowMoreHistory(req); return Json(sList); } #endregion [HttpPost] public JsonResult tradeHistoryQuery(TradeReq req) { CurUser.CheckClientPowerByClientId(req.ClientId ?? 0); if (ConsUserGroup.HasGroup && !ShowAllTrades) { var userAssetUnits = GetUserAssetunitIds(); req.AssetIdList = req.AssetIdList == null && !req.AssetIdList.Any() ? userAssetUnits : req.AssetIdList.Intersect(userAssetUnits).ToList(); } if (string.IsNullOrWhiteSpace(req.TradeTypes)) { req.NotInTradeTypes = new List() { "收益互换" }; } var sList = ClientAssetDataService.tradeHistoryQuery(req); return Json(sList); } [HttpPost] public JsonResult GetPreEndList(string id, TdTradeQueryModel req) { if (id == "forward") { req.OtcTradeType = DBModels.Enums.OtcTradeType.Forward; } else if (id == "swap") { req.OtcTradeType = DBModels.Enums.OtcTradeType.EquitySwap; } var userAssets = CurUser.GetAssetUnitIds(); var userClients = CurUser.GetClientIdsByCurUser(CurUser.交易管理_查看所有交易); var sList = new TodayTradeQueryService(CurUser).GetPreEndList(req, userAssets, userClients, CurUser.交易管理_查看所有交易); var umDataSource = Modules.DataCacheModule.DataCacheManager.GetUnderlyingDataSource(); if (id == "swap") { var tradeids = sList.rows.Select(r => r.id).ToList(); var tradecashids = sList.rows.Select(r => r.trade_cash.id).ToList(); var swapTrades = yldb.trade_swap.Where(t => tradeids.Contains(t.TradeId)).ToList(); var tradeCashSwaps = yldb.trade_cash_swap.Where(t => tradecashids.Contains(t.TradeCashId)).ToList(); foreach (var r in sList.rows) { r.trade_cash_swap = tradeCashSwaps.FirstOrDefault(x => x.TradeCashId == r.trade_cash.id); r.trade.trade_swap = swapTrades.FirstOrDefault(x => x.TradeId == r.trade.id); if (!r.trade.MetaDic.ContainsKey("GetUnderlyingName")) { var underlyingName = umDataSource.GetData(r.trade.trade_swap.GetUnderlyingCode)?.UnderlyingName; r.trade.MetaDic.Add("GetUnderlyingName", underlyingName); } if (!r.trade.MetaDic.ContainsKey("PayUnderlyingName")) { var underlyingName = umDataSource.GetData(r.trade.trade_swap.PayUnderlyingCode)?.UnderlyingName; r.trade.MetaDic.Add("PayUnderlyingName", underlyingName); } r.trade.UnderlyingName = umDataSource.GetData(r.trade.UnderlyingCode)?.UnderlyingName; r.trade.SettlementDate = r.trade.SettlementDate ?? r.trade.ExerciseDate; } } return Json(sList); } [HttpPost] public JsonResult GetPreEndGroupChildren(int TcId) { var sList = new TodayTradeQueryService(CurUser).GetPreEndGroupChildren(TcId); return Json(sList); } #region 模板增删 public static List GetAllClientBalanceTemplate() { var names = DBCacheManager.Single.GetTemplateNames("结算报告"); if (PS.Config.Company == Configuration.CompanyEnum.中金) { if (!names.Contains("北向")) { names.Add("北向"); } if (!names.Contains("南向")) { names.Add("南向"); } } return names.Select(o => new SelectListItem { Text = o, Value = o }).ToList(); } public JsonResult GetClientBalanceTemplate(string template = "默认") { var data = new { sendUser = DBCacheManager.Single.GetStr(CacheTable.TradeMarketSendUser, template), TradeMarketSheets = DBCacheManager.Single.GetStr(CacheTable.TradeMarketSheets, template), DingShiDesc = DBCacheManager.Single.GetStr(CacheTable.DingShiDesc, template), //TradeMarketSendUser = DBCacheManager.Single.GetStr(CacheTable.TradeMarketSendUser, template), LuoKuanDesc = DBCacheManager.Single.GetStr(CacheTable.LuoKuanDesc, template), MarginLuoKuanDesc = DBCacheManager.Single.GetStr(CacheTable.MarginLuoKuanDesc, template), Title = DBCacheManager.Single.GetStr(CacheTable.ClientBalanceReportTiltle, template), CCEmail = DBCacheManager.Single.GetStr(CacheTable.MarketCCEmail, template) }; return Json(data); } public JsonResult removeTemplate(string template) { DBCacheManager.Single.RemoveTemplate("结算报告", template); return JsonSuccess("删除成功"); } #endregion //[ValidateInput(false)] public JsonResult savedstext(string data, string sheets, string sendUser, string template = "默认") { DBCacheManager.Single.UpdateObj(CacheTable.DingShiDesc, data, template); DBCacheManager.Single.UpdateObj(CacheTable.TradeMarketSheets, sheets, template); DBCacheManager.Single.UpdateObj(CacheTable.TradeMarketSendUser, sendUser, template); return JsonSuccess("保存盯市说明成功"); } //[ValidateInput(false)] public JsonResult saveLuokuan(string sendUser, string title, string luokuan, string marginluokuan, string sheets, string ccemail, string template = "默认") { DBCacheManager.Single.UpdateObj(CacheTable.TradeMarketSendUser, sendUser, template); DBCacheManager.Single.UpdateObj(CacheTable.LuoKuanDesc, luokuan, template); DBCacheManager.Single.UpdateObj(CacheTable.MarginLuoKuanDesc, marginluokuan, template); DBCacheManager.Single.UpdateObj(CacheTable.TradeMarketSheets, sheets, template); DBCacheManager.Single.UpdateObj(CacheTable.ClientBalanceReportTiltle, title, template); string pattern = @"^([0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})$"; if (!string.IsNullOrEmpty(ccemail) && !Regex.IsMatch(ccemail, pattern)) { throw new ServiceException("邮件CC地址格式不正确"); } DBCacheManager.Single.UpdateObj(CacheTable.MarketCCEmail, ccemail, template); return JsonSuccess("保存邮件正文成功"); } public ViewResult TradeMarketDescSet() { return View(); } /// /// 向客户发送报告 /// //[ValidateInput(false)] [HttpPost] public async Task GenerateTradeMarketBill2(DingShiReportEmail emailData, string skipOrNot, List receiver, string template = "默认") { if (emailData is null) { throw new ArgumentNullException(nameof(emailData)); } if (skipOrNot == null) { skipOrNot = string.Empty; } IEnumerable userAssetUnits = null; if (ConsUserGroup.HasGroup && !ShowAllTrades) { userAssetUnits = GetUserAssetunitIds(); } var IsGap = false; var IsOuter = false; if (emailData.ReportType == "ClientBalanceGap") { IsGap = true; } if (emailData.ReportType == "GetOuterMargin") { IsOuter = true; } var IsNeedMarginCall = new SettlementReportService(CurUser).CheckIsNeedMarginCall(emailData.ClientId, emailData.From, emailData.To, emailData.PayableFund, IsGap, IsOuter, emailData.ParentFlag); if (PS.Config.Is国投) { IsNeedMarginCall = new SettlementReportFotGTService(CurUser).CheckIsNeedMarginCall(emailData.ClientId, emailData.From, emailData.To, emailData.PayableFund, IsGap, IsOuter, emailData.ParentFlag); } if (PS.Config.Is湘财) { IsNeedMarginCall = new SettlementReportFotGTService(CurUser).CheckIsNeedMarginCall(emailData.ClientId, emailData.From, emailData.To, emailData.PayableMargin, IsGap, IsOuter, emailData.ParentFlag); } if (IsNeedMarginCall && string.IsNullOrEmpty(skipOrNot)) { return JsonSuccess(string.Empty, new { message = "该客户需要追保,请确认是否使用追保邮件模板", type = "追保" }); } return await SendReportMails(emailData, userAssetUnits, CurUser, template, skipCheckMarginCall: skipOrNot.ToLower() == "skip", recevier: receiver); } public async Task SendReportMails(DingShiReportEmail emailData, IEnumerable userAssetUnits, OptUserInfo user, string template, bool needHtml = false, bool skipCheckMarginCall = false, List recevier = null) { try { EmailTradeConfirmResultType status; string message; var report = new SettlementReportFotShanXiService(user).GetReportData(emailData, userAssetUnits, template); (status, message) = new SettlementReportFotShanXiService(user).SendSettlementReports(emailData, report, template, skipCheckMarginCall, recevier); switch (status) { case EmailTradeConfirmResultType.Succeed: return JsonSuccess("发送盯市报告成功"); case EmailTradeConfirmResultType.NoEmailSetting: return JsonError("未设置邮箱,无法发送"); case EmailTradeConfirmResultType.EmailSentFailed: return JsonError("发送失败:" + message); case EmailTradeConfirmResultType.Other: default: return JsonError("发送邮件未知错误:" + message); } } catch (Exception e) { LogFactory.GetLogger().Error(e, "GenerateTradeMarketBill2"); return JsonError(e.Message == "The number of columns in PdfPTable constructor must be greater than zero." ? "生成的pdf列表的列数必须大于零,请检查配置列不可为空" : e.Message); } } public async Task BatchSendReportMails(List ClientIds, DateTime endDate) { var ret = new List(); var creditService = new ClientCreditRiskService(CurUser); if (ClientIds == null) { ret.Add("请选择要发送客户!"); return Json(ret); } foreach (var id in ClientIds) { var NeedMarginCall = creditService.ClientNeedMarginCall(id, endDate, out var clientName); if (!NeedMarginCall) { ret.Add(clientName + ":无需追保"); continue; } var emailData = new DingShiReportEmail() { ClientId = id, FileTypes = new List() { new DingShiReportEmail.CheckType() { type = "excel", @checked = true } }, TargetFileType = "excel", To = endDate, CurUserName = CurUser.UserName, }; var template = creditService.GetTemplateName(id); var rr = await SendReportMails(emailData, null, CurUser, template); ret.Add(clientName + ":" + ((Result)rr.Value).msg); } return Json(ret); } /// /// 批量下载报告 /// /// //[ValidateInput(false)] [HttpPost] public void GenerateDownloadTradeMarketBill2(DingShiReportEmail emailData, string template = "默认") { IEnumerable userAssetUnits = null; OptUserInfo user = OptUserInfo.SystemUser; //try { user = CurUser; } //catch { user = reportUser; } if (ConsUserGroup.HasGroup && !ShowAllTrades) { userAssetUnits = GetUserAssetunitIds(); } if (PS.Config.Company == Configuration.CompanyEnum.中金) { var report = new SettlementReportForZJService(user).GetReportData(emailData, userAssetUnits, template); new SettlementReportForZJService(user).GenerateFileEntry(report); } else { var report = new SettlementReportFotShanXiService(user).GetReportData(emailData, userAssetUnits, template); new SettlementReportFotShanXiService(user).GenerateFileEntry(report, "excel"); } } //[ValidateInput(false)] public async Task ViewTradeMarketFile(DingShiReportEmail emailData, string template = "默认") { IEnumerable userAssetUnits = null; if (ConsUserGroup.HasGroup && !ShowAllTrades) { userAssetUnits = GetUserAssetunitIds(); } var report = new SettlementReportFotShanXiService(CurUser).GetReportData(emailData, userAssetUnits, template); var path = new SettlementReportFotShanXiService(CurUser).GenerateFileEntry(report, emailData.TargetFileType); var relativePath = path.Substring(path.IndexOf("App_Docs") - 1); return JsonSuccess("", relativePath); } //[ValidateInput(false)] public ViewResult TradeMarketClientTxt(DingShiReport report) { return View(report); } public ViewResult TradeMarketClientSend(int clientid, double payablemargin = -1, double payableFund = -1, string reportType = "", bool ParentFlag = false) { var isEodValue = true; ViewBag.emails = ClientDataQueryService.GetClientEmails(clientid, false,isEodValue:isEodValue); ViewBag.TradeMarketSheets = DBCacheManager.Single.GetStr(CacheTable.TradeMarketSheets); ViewBag.LuoKuanDesc = DBCacheManager.Single.GetStr(CacheTable.LuoKuanDesc); ViewBag.MarginLuoKuanDesc = DBCacheManager.Single.GetStr(CacheTable.MarginLuoKuanDesc); ViewBag.PayableMargin = payablemargin; ViewBag.PayableFund = payableFund; ViewBag.ReportType = reportType; ViewBag.ParentFlag = ParentFlag; return View(); } public ViewResult TradeMarketClientPdf(DingShiReport report) { //ViewRenderer.RenderPartialView("~/Views/quotationconfirm/quotationtable.cshtml", selectedQuotation, this.ControllerContext); //todo 等谢磊方法 report.ClientBalance.DaliyPnl // report.eod_positionList.Sum(e=>e.pnl) //((eod_pnlGridSum)report.eod_positionList.Sum).DailyPnLSum; return View(report); } public ViewResult TradeMarketClientPdf_XiangCai(DingShiReport report) { //ViewRenderer.RenderPartialView("~/Views/quotationconfirm/quotationtable.cshtml", selectedQuotation, this.ControllerContext); //todo 等谢磊方法 report.ClientBalance.DaliyPnl // report.eod_positionList.Sum(e=>e.pnl) //((eod_pnlGridSum)report.eod_positionList.Sum).DailyPnLSum; return View(report); } [MyAuthorize("结算管理-导入外部结算数据")] public JsonResult ImportClientBalanceGap(IFormFile file, bool IsMargin = false) { try { if (!file.FileName.EndsWith("xlsx")) { return JsonError("文件格式不对,请使用xlsx文件"); } using (var stream = file.OpenReadStream()) { var result = new ClientCashInCashOutDataService(CurUser).ImportClientBalanceGap(stream, IsMargin); if (result.IsSuccess) { return JsonSuccess("导入成功"); } return JsonError(result.Message); } } catch (Exception ex) { LogFactory.GetLogger(nameof(ClientController)).Error("ImportClientBalanceGap", ex); return JsonError(ex.Message); throw; } } [AllowAnonymous] public JsonResult GetClientAccount(int clientId) { var obj = RealtimePnlCalc.GetClientBalance(clientId); if (obj==null) { return JsonError("获取资金失败"); } return JsonSuccess("",obj); } } }