Files
zszq-trs/YLErpWeb/Controllers/clientbalanceController.cs
T

662 lines
27 KiB
C#

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,
});
}
/// <summary>
/// 持仓明细
/// </summary>
/// <param name="clientId"></param>
/// <param name="startTime"></param>
/// <param name="endTime"></param>
/// <param name="ParentFlag"></param>
/// <returns></returns>
[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<string>() { "收益互换" };
}
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<SelectListItem> 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();
}
/// <summary>
/// 向客户发送报告
/// </summary>
//[ValidateInput(false)]
[HttpPost]
public async Task<JsonResult> GenerateTradeMarketBill2(DingShiReportEmail emailData, string skipOrNot, List<string> receiver, string template = "默认")
{
if (emailData is null)
{
throw new ArgumentNullException(nameof(emailData));
}
if (skipOrNot == null)
{
skipOrNot = string.Empty;
}
IEnumerable<int> 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<JsonResult> SendReportMails(DingShiReportEmail emailData, IEnumerable<int> userAssetUnits, OptUserInfo user, string template, bool needHtml = false, bool skipCheckMarginCall = false, List<string> 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<clientbalanceController>().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<JsonResult> BatchSendReportMails(List<int> ClientIds, DateTime endDate)
{
var ret = new List<string>();
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<DingShiReportEmail.CheckType>()
{
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);
}
/// <summary>
/// 批量下载报告
/// </summary>
/// <returns></returns>
//[ValidateInput(false)]
[HttpPost]
public void GenerateDownloadTradeMarketBill2(DingShiReportEmail emailData, string template = "默认")
{
IEnumerable<int> 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<JsonResult> ViewTradeMarketFile(DingShiReportEmail emailData, string template = "默认")
{
IEnumerable<int> 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);
}
}
}