9092 lines
456 KiB
C#
9092 lines
456 KiB
C#
using iTextSharp.text;
|
||
using iTextSharp.text.pdf;
|
||
using NPOI.POIFS.Crypt;
|
||
using Qdp.Pricing.Base.Enums;
|
||
using RazorEngineCore;
|
||
using System.Data;
|
||
using System.Drawing;
|
||
using System.Reflection;
|
||
using System.Text;
|
||
using System.Text.RegularExpressions;
|
||
using System.Web.Mvc;
|
||
using YLErp.BLL.Eod;
|
||
using YLErp.BLL.MarginCalculation;
|
||
using YLErp.Commons;
|
||
using YLErp.Configuration;
|
||
using YLErp.DBModels.Abstract;
|
||
using YLErp.DBModels.Consts;
|
||
using YLErp.DBModels.Converts;
|
||
using YLErp.DBModels.Enums;
|
||
using YLErp.DBModels.Helpers;
|
||
using YLErp.Enums;
|
||
using YLErp.Model.Enum;
|
||
using YLErp.Models.Tag;
|
||
using YLErp.Modules.ApprovalModule;
|
||
using YLErp.Modules.CalculationModule;
|
||
using YLErp.Modules.ClientModule;
|
||
using YLErp.Modules.DataProviderModule;
|
||
using YLErp.Modules.DictionaryModule;
|
||
using YLErp.Modules.EodModule;
|
||
using YLErp.Modules.FinancialModule;
|
||
using YLErp.Modules.ReportModule;
|
||
using YLErp.Modules.RiskModule;
|
||
using YLErp.Modules.SalesModule;
|
||
using YLErp.Modules.StructureModule;
|
||
using YLErp.Modules.SystemModule;
|
||
using YLErp.Modules.TagModule;
|
||
using YLErp.Modules.TagModule.Dto;
|
||
using YLErp.Modules.TradeDalModule;
|
||
using YLErp.Modules.TradeModule;
|
||
using YLErp.Modules.TradeModule.AccumulatorOptionModule;
|
||
using YLErp.Modules.TradeModule.DealModule;
|
||
using YLErp.Modules.TradeModule.DocGenerateModule;
|
||
using YLErp.Modules.TradeModule.ExoticOptionModule;
|
||
using YLErp.Modules.TradeModule.OrderModule;
|
||
using YLErp.Modules.TradeModule.QueryModule;
|
||
using YLErp.Modules.TradeModule.Structure_dz;
|
||
using YLErp.Modules.TradeRiskCalcModule;
|
||
using YLErp.Modules.UnderlyingModule;
|
||
using YLErp.Modules.VolatilityModule;
|
||
using YLErp.Office;
|
||
using YLErp.Office.iTextModule;
|
||
using YLErp.QdpModule;
|
||
using ExcelHelper = YLErp.Commons.ExcelHelper;
|
||
|
||
namespace YLErp.Web.Controllers
|
||
{
|
||
public partial class tradeController : OtcTradeControllerBase
|
||
{
|
||
private readonly YLContext db = new YLContext();
|
||
|
||
private readonly IYcLogger _logger;
|
||
|
||
public tradeController()
|
||
{
|
||
_logger = LogFactory.GetLogger<tradeController>();
|
||
}
|
||
|
||
public ActionResult tradeListInner(string ucode, string TradeType, int? BookId, string ExchangeOptionCode)
|
||
{
|
||
var trades = db.trade.Where(t => t.ValidState != "InValid" && t.UnderlyingCode == ucode && ConsTrade.TradeTypesForHedge.Contains(t.TradeType) && t.TradeType == TradeType).ToList();
|
||
if (BookId > 0)
|
||
{
|
||
trades = trades.Where(t => t.AssetId == BookId).ToList();
|
||
}
|
||
if (!string.IsNullOrWhiteSpace(ExchangeOptionCode) && ExchangeOptionCode != "null")
|
||
{
|
||
trades = trades.Where(t => t.ExchangeOptionCode == ExchangeOptionCode).ToList();
|
||
}
|
||
trades.ForEach(r =>
|
||
{
|
||
r.LotsNewInfo = TradeLotsCalc.GetLots(r.UnderlyingCode, r.Notional);
|
||
});
|
||
return View(trades);
|
||
}
|
||
|
||
public ActionResult PickSingletrade()
|
||
{
|
||
return View();
|
||
}
|
||
|
||
//---------------------- tradeList--------------------
|
||
|
||
/// <summary>
|
||
/// 交易搜索
|
||
/// </summary>
|
||
/// <param name="tabIndex"></param>
|
||
/// <param name="sourceType">1:期权交易;2:标的交易</param>
|
||
/// <returns></returns>
|
||
[MyAuthorize("交易管理-交易搜索")]
|
||
public ActionResult tradeList(int? tabIndex, int sourceType = 1, string settleDate = null, string tradeType = null)
|
||
{
|
||
if (tabIndex <= 0 || tabIndex == null)
|
||
{
|
||
ViewBag.TabIndex = (int)TradeTabIndexEnum.场外成交记录;
|
||
}
|
||
else if (tabIndex == (int)TradeTabIndexEnum.场内成交记录)
|
||
{
|
||
ViewBag.sourceType = sourceType;
|
||
return View("~/Views/ExchangeTrade/OptionTradeList.cshtml", sourceType);
|
||
}
|
||
else
|
||
{
|
||
ViewBag.TabIndex = tabIndex;
|
||
}
|
||
|
||
ViewBag.settleDate = settleDate;
|
||
ViewBag.TradeType = tradeType;
|
||
|
||
return View();
|
||
}
|
||
|
||
[MyAuthorize("结算管理-行权日报告")]
|
||
public ActionResult maturityDateTradeList()
|
||
{
|
||
return View();
|
||
}
|
||
|
||
[MyAuthorize("结算管理-客户平仓到期报告")]
|
||
public ActionResult dayUnwindReport()
|
||
{
|
||
ViewBag.valueDate = valuedateBLL.ValueDate.ToString("yyyy-MM-dd");
|
||
return View();
|
||
}
|
||
|
||
public ActionResult clientMaturityDateTradeList()
|
||
{
|
||
return View();
|
||
}
|
||
|
||
[MyAuthorize("风险控制-情景分析")]
|
||
public ActionResult tradeScenario()
|
||
{
|
||
return Redirect("/ScenarioAnalysis/tradescenario");
|
||
}
|
||
|
||
#region 财务汇总
|
||
[MyAuthorize("结算管理-财务汇总")]
|
||
public ActionResult FinancialSummary()
|
||
{
|
||
if (PS.Config.Is广发商贸)
|
||
{
|
||
return Redirect("/trade/FinancialSummary_GF");
|
||
}
|
||
var date = QdpCalendarHelper.GetNonHoliday(valuedateBLL.ValueDate.AddDays(-1));
|
||
var startDate = date.AddDays(1 - date.Day);
|
||
startDate = QdpCalendarHelper.GetNonHoliday(startDate);
|
||
ViewBag.CurrentPeriodStart = startDate.ToString("yyyy-MM-dd");
|
||
ViewBag.CurrentDate = date.ToString("yyyy-MM-dd");
|
||
var endDate = db.eodStatus.Where(O => O.Status == "已收盘").Select(O => O.ValueDate).OrderByDescending(O => O).FirstOrDefault();
|
||
if (endDate == default)
|
||
{
|
||
endDate = valuedateBLL.ValueDate;
|
||
}
|
||
ViewBag.MonthFirstDay = new DateTime(endDate.Year, endDate.Month, 1).ToString("yyyy-MM-dd");
|
||
ViewBag.LastValueDate = endDate.ToString("yyyy-MM-dd");
|
||
ViewBag.SummaryType = "场外期权";
|
||
return View();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 广发定制财务汇总页面
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
[MyAuthorize("结算管理-财务汇总")]
|
||
public ActionResult FinancialSummary_GF()
|
||
{
|
||
var date = QdpCalendarHelper.GetNonHoliday(valuedateBLL.ValueDate.AddDays(-1));
|
||
var startDate = date.AddDays(1 - date.Day);
|
||
startDate = QdpCalendarHelper.GetNonHoliday(startDate);
|
||
ViewBag.CurrentPeriodStart = startDate.ToString("yyyy-MM-dd");
|
||
ViewBag.CurrentDate = date.ToString("yyyy-MM-dd");
|
||
var endDate = db.eodStatus.Where(O => O.Status == "已收盘").Select(O => O.ValueDate).OrderByDescending(O => O).FirstOrDefault();
|
||
if (endDate == default)
|
||
{
|
||
endDate = valuedateBLL.ValueDate;
|
||
}
|
||
ViewBag.MonthFirstDay = new DateTime(endDate.Year, endDate.Month, 1).ToString("yyyy-MM-dd");
|
||
ViewBag.LastValueDate = endDate.ToString("yyyy-MM-dd");
|
||
ViewBag.SummaryType = "场外期权";
|
||
return View();
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
public ActionResult FinancialCodeMaintenance()
|
||
{
|
||
if (!CurUser.HasRight("结算管理-财务编码维护"))
|
||
{
|
||
return JsonError("无权限");
|
||
}
|
||
var NeedMaintenance = new List<string>() { "用友客商编码", "财务凭证排除客户项", "财务凭证明细段", "用友科目编码" };
|
||
var list = (from o in new ErpBaseContext().Dictionaries.AsNoTracking()
|
||
where NeedMaintenance.Contains(o.Name)
|
||
select o).ToList().OrderBy(n => n.Id).ToList();
|
||
|
||
return View(list);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 导入用友客商
|
||
/// </summary>
|
||
public ActionResult YonYouClientCodeUpload()
|
||
{
|
||
return View();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 导入用友客商信息
|
||
/// </summary>
|
||
public ActionResult UploadYonYouClientCodeMain(string importWay, string MasterType)
|
||
{
|
||
if (Request.Form.Files.Count == 0)
|
||
{
|
||
return JsonError("缺少上传文件");
|
||
}
|
||
|
||
var file = Request.Form.Files[0];
|
||
var fileExt = Path.GetExtension(file.FileName)?.ToLowerInvariant();
|
||
var optService = new YYClientCodeMaintenanceService(CurUser);
|
||
List<DictionaryItem> items;
|
||
var result = HandleResult.Success;
|
||
var needDeleteAll = importWay == "Full";
|
||
try
|
||
{
|
||
if (fileExt == ".csv")
|
||
{
|
||
items = GetYonYouClientCode(file, MasterType, needDeleteAll);
|
||
}
|
||
else if (fileExt == ".xlsx")
|
||
{
|
||
items = GetYonYouClientCodeFromExcel(file, needDeleteAll);
|
||
}
|
||
else
|
||
{
|
||
return JsonError("请上传xlsx或csv格式文件");
|
||
}
|
||
|
||
if (needDeleteAll)
|
||
{
|
||
result = optService.DeleteAllYonYouClientCode();
|
||
}
|
||
if (result.IsSuccess)
|
||
{
|
||
result = optService.UploadYYClientCodeToDb(items);
|
||
}
|
||
|
||
|
||
if (result.IsSuccess)
|
||
{
|
||
return JsonSuccess("导入成功");
|
||
}
|
||
else
|
||
{
|
||
return JsonError(result.Message);
|
||
}
|
||
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
return JsonError(ex.Message);
|
||
}
|
||
|
||
|
||
|
||
}
|
||
|
||
public List<DictionaryItem> GetYonYouClientCode(IFormFile file, string MasterType, bool needDeleteAll)
|
||
{
|
||
var fileName = "";
|
||
|
||
//上传交易存储目录
|
||
var MainUploadPath = "/App_Upload/Salesman";
|
||
|
||
var filePathName = string.Empty;
|
||
|
||
if (Request.Form.Files.Count == 0)
|
||
{
|
||
throw new ServiceException("保存失败");
|
||
}
|
||
try
|
||
{
|
||
//上传同名文件会覆盖
|
||
fileName = DateTime.Now.ToString("yyyyMMddHHmmss") + "_" + file.FileName;
|
||
var directoryName = string.Format("{1}{0}/", MasterType, MainUploadPath);
|
||
filePathName = directoryName + fileName; //自行处理保存
|
||
var pafile = Server.MapPath(directoryName);
|
||
if (!Directory.Exists(pafile))
|
||
{
|
||
Directory.CreateDirectory(pafile);
|
||
}
|
||
//Request.Form.Files[0].FileName
|
||
var pa = Server.MapPath(filePathName);
|
||
|
||
file.SaveAs(pa); //把文件上传到服务器的绝对路径上
|
||
|
||
var result = new YYClientCodeMaintenanceService(CurUser).GetYonYouClientCodeFormCsv(pa, needDeleteAll);
|
||
|
||
return result;
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
LogFactory.GetLogger(nameof(ClientController)).Error("UploadYonYouClientCode", ex);
|
||
throw new ServiceException(ex.Message);
|
||
};
|
||
}
|
||
|
||
public List<DictionaryItem> GetYonYouClientCodeFromExcel(IFormFile file, bool needDeleteAll)
|
||
{
|
||
try
|
||
{
|
||
using var openStream = file.OpenReadStream();
|
||
var result = new YYClientCodeMaintenanceService(CurUser).GetYonYouClientCodeFromExcel(openStream, CurUser.UserId, CurUser.UserName, needDeleteAll);
|
||
return result;
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
LogFactory.GetLogger(nameof(ClientController)).Error("UploadYonYouClientCodeExcel", ex);
|
||
throw new ServiceException(ex.Message);
|
||
}
|
||
}
|
||
|
||
public ActionResult ExportYonYouClientCode()
|
||
{
|
||
var fileContent = new YYClientCodeMaintenanceService(CurUser).ExportYYClientCode();
|
||
return File(fileContent, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
||
$"用友客商编码{DateTime.Today:yyyyMMdd}.xlsx");
|
||
}
|
||
#endregion
|
||
|
||
public ActionResult SaveConfirmDate(int tradeCashId, DateTime confirmDate)
|
||
{
|
||
var info = Return.Fail<trade_cash>("未知错误");
|
||
try
|
||
{
|
||
using (var db = new YLContext())
|
||
{
|
||
var tradecash = (from tcDb in db.trade_cash where tcDb.id == tradeCashId && !tcDb.IsDeleted select tcDb).FirstOrDefault();
|
||
if (tradecash == null) { info = Return.Fail<trade_cash>("交易不存在"); }
|
||
else
|
||
{
|
||
tradecash.ConfirmDate = confirmDate;
|
||
db.SaveChanges();
|
||
info = Return.Success<trade_cash>(tradecash);
|
||
}
|
||
}
|
||
}
|
||
catch (Exception) { }
|
||
return Json(info);
|
||
}
|
||
|
||
[MyAuthorize("结算管理-财务汇总")]
|
||
public SearchListResult<FinancialSummaryExchangeModel> FinancialSummary_Exchange(FinancialSummaryModelReq req)
|
||
{
|
||
return tradeBLL.SearchExchangeTrade(req);
|
||
}
|
||
|
||
public JsonResult FinancialSummaryQuery(FinancialSummaryModelReq req)
|
||
{
|
||
if (req.CurrentPeriodDateStart == default || req.CurrentPeriodDateEnd == default)
|
||
{
|
||
return Json("本期区间值不应为空");
|
||
}
|
||
req.UserAssets = CurUser.GetAssetUnitIds();
|
||
req.UserClients = CurUser.GetClientIdsByCurUser(CurUser.交易管理_查看所有交易);
|
||
req.CurUserTradeIds = CurUser.GetTradeIdsByCurUser();
|
||
object result;
|
||
switch (req.SummaryType)
|
||
{
|
||
case "场内期权":
|
||
result = FinancialSummary_Exchange(req);
|
||
break;
|
||
case "远期/掉期":
|
||
case "场外期权":
|
||
case "互换":
|
||
default:
|
||
result = new CJFinancialVoucherService(CurUser).FinancialSummary_Option(req);
|
||
break;
|
||
}
|
||
|
||
return Json(result);
|
||
}
|
||
|
||
public JsonResult UnitSummaryQuery(FinancialSummaryModelReq req)
|
||
{
|
||
if (req.CurrentPeriodDateStart == default || req.CurrentPeriodDateEnd == default)
|
||
{
|
||
return Json("本期区间值不应为空");
|
||
}
|
||
req.UserAssets = CurUser.GetAssetUnitIds();
|
||
req.UserClients = CurUser.GetClientIdsByCurUser(CurUser.交易管理_查看所有交易);
|
||
req.CurUserTradeIds = CurUser.GetTradeIdsByCurUser();
|
||
var financialSummaryOptions = new FinancialVoucherService(CurUser).GatherUnitData(req);
|
||
|
||
// var exchangeOption = FinancialSummary_Exchange(req);
|
||
//簿记品种维度处理
|
||
|
||
return Json(financialSummaryOptions);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 广发定制财务汇总数据查询
|
||
/// </summary>
|
||
/// <param name="req"></param>
|
||
/// <returns></returns>
|
||
public JsonResult FinancialSummaryQuery_GF(FinancialSummaryModelReq req)
|
||
{
|
||
if (req.CurrentPeriodDateStart == default || req.CurrentPeriodDateEnd == default)
|
||
{
|
||
return Json("本期区间值不应为空");
|
||
}
|
||
|
||
req.BookIds = AssetUnitModel.IntersectAssetUnits(req.AssetIdGroupList, req.BookIds).ToList();
|
||
req.UserAssets = CurUser.GetAssetUnitIds();
|
||
req.UserClients = CurUser.GetClientIdsByCurUser(CurUser.交易管理_查看所有交易);
|
||
req.CurUserTradeIds = CurUser.GetTradeIdsByCurUser();
|
||
object result;
|
||
switch (req.SummaryType)
|
||
{
|
||
case "场内期权":
|
||
result = FinancialSummary_Exchange(req);
|
||
break;
|
||
case "远期/掉期":
|
||
case "场外期权":
|
||
case "互换":
|
||
default:
|
||
result = new FinancialVoucherService(CurUser).GatherClientData(req);
|
||
break;
|
||
}
|
||
|
||
return Json(result);
|
||
}
|
||
|
||
#region 导出财务凭证
|
||
public ActionResult DownloadFinancialVoucher(FinancialVoucherReq req)
|
||
{
|
||
try
|
||
{
|
||
byte[] buffer = null;
|
||
var list = new List<FinancialVoucherDto>();
|
||
var outputName = "";
|
||
var financialVoucherSv = new YYFinancialVoucherService(CurUser);
|
||
switch (req.VoucherType)
|
||
{
|
||
case FinancialVoucher_YongYouEnum.DepositWithdraw:
|
||
list = financialVoucherSv.GetCashInOutData(req);
|
||
outputName = $"用友-客户出金入金{DateTime.Now:yyyy-MM-dd-ssss}.xlsx";
|
||
break;
|
||
case FinancialVoucher_YongYouEnum.OTCConfirmed:
|
||
list = financialVoucherSv.GetOTCConfirmedData(req);
|
||
outputName = $"用友-商品场外期权-成交{DateTime.Now:yyyy-MM-dd-ssss}.xlsx";
|
||
break;
|
||
case FinancialVoucher_YongYouEnum.OTCTermination:
|
||
list = financialVoucherSv.GetOTCMaturityData(req);
|
||
outputName = $"用友-商品场外期权-提前终止、部分提前终止{DateTime.Now:yyyy-MM-dd-ssss}.xlsx";
|
||
break;
|
||
case FinancialVoucher_YongYouEnum.OTCMaturity:
|
||
list = financialVoucherSv.GetOTCTerminationData(req);
|
||
outputName = $"用友-商品场外期权-到期、部分到期{DateTime.Now:yyyy-MM-dd-ssss}.xlsx";
|
||
break;
|
||
default: break;
|
||
}
|
||
|
||
if (list == null || list.Count == 0) { return ShowError("没有可导出的数据!"); }
|
||
|
||
var modelDict = new Dictionary<string, object>
|
||
{
|
||
["Sheet1"] = new
|
||
{
|
||
InfoList = list
|
||
}
|
||
};
|
||
var sourcePath = OtcAppContext.MapPath("~/App_Docs/导出模板");
|
||
var settleDocName = "用友凭证模板.xlsx";
|
||
var sourceFileName = Path.Combine(sourcePath, settleDocName);
|
||
buffer = new ExcelTemplateGenerator().SetTemplateFile(sourceFileName).SetTemplateData(modelDict).Output();
|
||
|
||
if (buffer == null)
|
||
{
|
||
return ShowError("没有可导出的数据!");
|
||
}
|
||
else
|
||
{
|
||
return File(buffer, "application/ms-excel", outputName);
|
||
}
|
||
|
||
}
|
||
catch (Exception e)
|
||
{
|
||
return ShowError("发生异常!" + e.Message);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 长江凭证导出
|
||
/// </summary>
|
||
/// <param name="req"></param>
|
||
/// <returns></returns>
|
||
public ActionResult DownloadCJFinancialVoucher(FinancialVoucher_CJReq req)
|
||
{
|
||
try
|
||
{
|
||
LogFactory.GetLogger("财务凭证导出").Info("1");
|
||
|
||
req.UserAssets = CurUser.GetAssetUnitIds();
|
||
req.UserClients = CurUser.GetClientIdsByCurUser(CurUser.交易管理_查看所有交易);
|
||
|
||
byte[] buffer = null;
|
||
var financialVoucherCJSv = new CJFinancialVoucherService(CurUser);
|
||
var model = financialVoucherCJSv.GetTradeConfirmData(req);
|
||
var cashinout = financialVoucherCJSv.GetCashInOutTotal(req);
|
||
model.CashInOutInfoList = cashinout;
|
||
|
||
var zipWebPath = $"~/App_Docs/导出文件/长江财务凭证";
|
||
var zipLocalFolder = Server.MapPath(zipWebPath + $"//{DateTime.Now:yyyyMMddHHmmssffff}");
|
||
Directory.CreateDirectory(zipLocalFolder);
|
||
|
||
var outputName = $"{zipLocalFolder}/长江财务凭证导出{req.EndDate.Month}月份" + "-{0}.xlsx";
|
||
var outputZipName = $"长江财务凭证导出 {DateTime.Now:yyyy-MM-dd-HHmmss}.zip";
|
||
|
||
switch (req.SummaryType)
|
||
{
|
||
case "场外期权":
|
||
//持仓成本
|
||
var title1 = "持仓成本";
|
||
var templateFilePath1 = Server.MapPath($"~/App_Docs/导出模板/长江财务凭证模板_{title1}.xlsx");
|
||
var outputFilePath1 = string.Format(outputName, title1);
|
||
using (var generator = Office.ExcelModule.ExcelGenerator.UseTemplateGenerator(templateFilePath1).
|
||
AddVariable(model))
|
||
{
|
||
generator.Generate();
|
||
generator.SaveAs(outputFilePath1);
|
||
}
|
||
|
||
//持仓盈亏
|
||
var title2 = "持仓盈亏";
|
||
var templateFilePath2 = Server.MapPath($"~/App_Docs/导出模板/长江财务凭证模板_{title2}.xlsx");
|
||
var outputFilePath2 = string.Format(outputName, title2);
|
||
using (var generator = Office.ExcelModule.ExcelGenerator.UseTemplateGenerator(templateFilePath2).
|
||
AddVariable(model))
|
||
{
|
||
generator.Generate();
|
||
generator.SaveAs(outputFilePath2);
|
||
}
|
||
|
||
//平仓盈亏
|
||
var title3 = "平仓盈亏";
|
||
var templateFilePath3 = Server.MapPath($"~/App_Docs/导出模板/长江财务凭证模板_{title3}.xlsx");
|
||
var outputFilePath3 = string.Format(outputName, title3);
|
||
using (var generator = Office.ExcelModule.ExcelGenerator.UseTemplateGenerator(templateFilePath3).
|
||
AddVariable(model))
|
||
{
|
||
generator.Generate();
|
||
generator.SaveAs(outputFilePath3);
|
||
}
|
||
|
||
//出入金
|
||
var title4 = "出入金";
|
||
var templateFilePath4 = Server.MapPath($"~/App_Docs/导出模板/长江财务凭证模板_{title4}.xlsx");
|
||
var outputFilePath4 = string.Format(outputName, title4);
|
||
using (var generator = Office.ExcelModule.ExcelGenerator.UseTemplateGenerator(templateFilePath4).
|
||
AddVariable(model))
|
||
{
|
||
generator.Generate();
|
||
generator.SaveAs(outputFilePath4);
|
||
}
|
||
outputZipName = $"长江财务凭证导出场外期权{DateTime.Now:yyyy-MM-dd-HHmmss}.zip";
|
||
break;
|
||
case "远期/掉期":
|
||
var title5 = "远期掉期";
|
||
var templateFilePath5 = Server.MapPath($"~/App_Docs/导出模板/长江财务凭证模板_{title5}.xlsx");
|
||
var outputFilePath5 = string.Format(outputName, title5);
|
||
using (var generator = Office.ExcelModule.ExcelGenerator.UseTemplateGenerator(templateFilePath5).
|
||
AddVariable(model))
|
||
{
|
||
generator.Generate();
|
||
generator.SaveAs(outputFilePath5);
|
||
}
|
||
outputZipName = $"长江财务凭证导出远期掉期{DateTime.Now:yyyy-MM-dd-HHmmss}.zip";
|
||
break;
|
||
case "互换":
|
||
var title6 = "互换";
|
||
var templateFilePath6 = Server.MapPath($"~/App_Docs/导出模板/长江财务凭证模板_{title6}.xlsx");
|
||
var outputFilePath6 = string.Format(outputName, title6);
|
||
using (var generator = Office.ExcelModule.ExcelGenerator.UseTemplateGenerator(templateFilePath6).
|
||
AddVariable(model))
|
||
{
|
||
generator.Generate();
|
||
generator.SaveAs(outputFilePath6);
|
||
}
|
||
outputZipName = $"长江财务凭证导出互换{DateTime.Now:yyyy-MM-dd-HHmmss}.zip";
|
||
break;
|
||
}
|
||
|
||
//压缩汇总
|
||
var marketZipFile = Path.Combine(Server.MapPath(zipWebPath), outputZipName);
|
||
ZipHelper.ZipFilesWithLevel(Directory.GetFiles(zipLocalFolder).ToList(), marketZipFile, 0);
|
||
Directory.Delete(zipLocalFolder, true);
|
||
|
||
using (var fs = new FileStream(marketZipFile, FileMode.Open, FileAccess.Read))
|
||
{
|
||
|
||
buffer = new byte[fs.Length];
|
||
fs.Read(buffer, 0, (int)fs.Length);
|
||
return File(buffer, "application/x-zip-compressed", $"长江财务凭证导出{req.EndDate.Month}月份.zip");
|
||
}
|
||
}
|
||
catch (TargetInvocationException ex)
|
||
{
|
||
if (ex.InnerException != null && ex.InnerException is KeyNotFoundException)
|
||
{
|
||
return ShowError("导出模板和财务编码中信息不匹配,请检查相应配置是否正确.");
|
||
}
|
||
else
|
||
{
|
||
LogFactory.GetLogger("财务凭证导出").Info("2");
|
||
LogFactory.GetLogger("财务凭证导出").Error(ex);
|
||
return ShowError("发生异常!" + ex.Message);
|
||
}
|
||
}
|
||
catch (Exception e)
|
||
{
|
||
LogFactory.GetLogger("财务凭证导出").Info("2");
|
||
LogFactory.GetLogger("财务凭证导出").Error(e);
|
||
return ShowError("发生异常!" + e.Message);
|
||
}
|
||
}
|
||
|
||
|
||
/// <summary>
|
||
/// 中粮凭证导出
|
||
/// </summary>
|
||
/// <param name="req"></param>
|
||
/// <returns></returns>
|
||
public ActionResult DownloadZLFinancialVoucher(ZLFinancialVoucherReq req)
|
||
{
|
||
try
|
||
{
|
||
byte[] buffer = null;
|
||
var list = new List<ZLFinancialVoucherDto>();
|
||
var outputName = "";
|
||
var settleDocName = "";
|
||
var financialVoucherSv = new YYFinancialVoucherService(CurUser);
|
||
|
||
switch (req.ZLVoucherType)
|
||
{
|
||
case FinancialVoucher_YongYouEnum_ZhongLiang.BuyDeal:
|
||
list = financialVoucherSv.GetBuyDealData(req);
|
||
outputName = $"用友-客户买权成交{DateTime.Now:yyyy-MM-dd}.xlsx";
|
||
settleDocName = "用友-买权成交模板.xlsx";
|
||
break;
|
||
case FinancialVoucher_YongYouEnum_ZhongLiang.BuyPositionLoss:
|
||
list = financialVoucherSv.GetBuyPositionLossData(req);
|
||
outputName = $"用友-客户买权持仓盈亏{DateTime.Now:yyyy-MM-dd}.xlsx";
|
||
settleDocName = "用友-买权持仓盈亏模板.xlsx";
|
||
break;
|
||
case FinancialVoucher_YongYouEnum_ZhongLiang.BuyCloseLosses:
|
||
list = financialVoucherSv.GetBuyCloseLossesData(req);
|
||
outputName = $"用友-客户买权平仓盈亏{DateTime.Now:yyyy-MM-dd}.xlsx";
|
||
settleDocName = "用友-买权平仓盈亏模板.xlsx";
|
||
break;
|
||
case FinancialVoucher_YongYouEnum_ZhongLiang.SellDeal:
|
||
list = financialVoucherSv.GetSellDealData(req);
|
||
outputName = $"用友-客户卖权成交{DateTime.Now:yyyy-MM-dd}.xlsx";
|
||
settleDocName = "用友-卖权成交模板.xlsx";
|
||
break;
|
||
|
||
case FinancialVoucher_YongYouEnum_ZhongLiang.SellPositionLoss:
|
||
list = financialVoucherSv.GetSellPositionLossData(req);
|
||
outputName = $"用友-客户卖权持仓盈亏{DateTime.Now:yyyy-MM-dd}.xlsx";
|
||
settleDocName = "用友-卖权持仓盈亏模板.xlsx";
|
||
break;
|
||
case FinancialVoucher_YongYouEnum_ZhongLiang.SellCloseLosses:
|
||
list = financialVoucherSv.GetSellCloseLossesData(req);
|
||
outputName = $"用友-客户卖权平仓盈亏{DateTime.Now:yyyy-MM-dd}.xlsx";
|
||
settleDocName = "用友-卖权平仓盈亏模板.xlsx";
|
||
break;
|
||
case FinancialVoucher_YongYouEnum_ZhongLiang.DepositWithdraw:
|
||
list = financialVoucherSv.GetDepositWithdrawData(req);
|
||
outputName = $"用友-客户出入金{DateTime.Now:yyyy-MM-dd}.xlsx";
|
||
settleDocName = "用友-出入金的凭证模板.xlsx";
|
||
break;
|
||
default: break;
|
||
}
|
||
if (list == null || list.Count == 0) { return ShowError("没有可导出的数据!"); }
|
||
var modelDict = new Dictionary<string, object>
|
||
{
|
||
["Sheet1"] = new
|
||
{
|
||
InfoList = list
|
||
}
|
||
};
|
||
var sourcePath = OtcAppContext.MapPath("~/App_Docs/导出模板/中粮用友");
|
||
var sourceFileName = Path.Combine(sourcePath, settleDocName);
|
||
buffer = new ExcelTemplateGenerator().SetTemplateFile(sourceFileName).SetTemplateData(modelDict).Output();
|
||
if (buffer == null)
|
||
{
|
||
return ShowError("没有可导出的数据!");
|
||
}
|
||
else
|
||
{
|
||
return File(buffer, "application/ms-excel", outputName);
|
||
}
|
||
}
|
||
catch (Exception e)
|
||
{
|
||
return ShowError("发生异常!" + e.Message);
|
||
}
|
||
}
|
||
#endregion
|
||
|
||
[HttpPost]
|
||
public ActionResult SaveYongYouKeMuCode()
|
||
{
|
||
var save = WebExtensions.ToQueryString(Request.Form, false);
|
||
new YLErp.Modules.AppModule.AppConfigService(CurUser).SaveConfig("ProjectConfig", "Erp.YongYouKeMuCode", save, "string", "用友科目编码");
|
||
PS.SetConfig(nameof(PS.Config.ErpElement.YongYouKeMuCode), save);
|
||
return JsonSuccess();
|
||
}
|
||
|
||
private ActionResult DownloadFinancialExangeSummary(FinancialSummaryModelReq req, string type, out byte[] buffer, bool query = false)
|
||
{
|
||
buffer = null;
|
||
if (!(FinancialSummaryQuery(req).Value is SearchListResult<FinancialSummaryExchangeModel> searchList))
|
||
{
|
||
return Json(Return.Fail("数据不存在"));
|
||
}
|
||
var list = searchList.rows.ToList();
|
||
if (query)//如果只是查询数据是否存在,则只返回错误信息或数量;
|
||
{
|
||
if (list.Count > 0)
|
||
{
|
||
return Json(Return.Success(searchList.records.ToString()));
|
||
}
|
||
else { return Json(Return.Fail("数据不存在")); }
|
||
}
|
||
if (list.Count == 0) { return ShowError("数据不存在"); }
|
||
|
||
var modelDict = new Dictionary<string, object>
|
||
{
|
||
["Sheet1"] = new
|
||
{
|
||
searchList.Sum,
|
||
InfoList = list
|
||
}
|
||
};
|
||
var sourcePath = OtcAppContext.MapPath("~/App_Docs");
|
||
var settleDocName = "财务汇总-场内期权.xlsx";
|
||
var sourceFileName = Path.Combine(sourcePath, settleDocName);
|
||
//var targetPath = Path.Combine(sourcePath, "temp");
|
||
//var targetFileName = $"财务汇总-场内期权{DateTime.Now.ToString("yyyyMMddHHmmss")}.xlsx";
|
||
buffer = new ExcelTemplateGenerator().SetTemplateFile(sourceFileName).SetTemplateData(modelDict).Output();
|
||
return File(buffer, xlsxMimeType);
|
||
}
|
||
|
||
private ActionResult DownloadFinancialOptionSummary(FinancialSummaryModelReq req, string type, out byte[] buffer, bool query = false)
|
||
{
|
||
buffer = null;
|
||
if (!(FinancialSummaryQuery(req).Value is SearchListResult<FinancialSummaryOptionModel> searchList))
|
||
{
|
||
return Json(Return.Fail("数据不存在"));
|
||
}
|
||
var list = searchList.rows.ToList();
|
||
if (query)//如果只是查询数据是否存在,则只返回错误信息或数量;
|
||
{
|
||
if (list.Count > 0) { return Json(Return.Success(searchList.records.ToString())); }
|
||
else { return Json(Return.Fail("数据不存在")); }
|
||
}
|
||
if (list.Count == 0) { return ShowError("数据不存在"); }
|
||
|
||
list.ForEach(a =>
|
||
{
|
||
if (PS.Config.IsUseDisplayNotional)
|
||
{
|
||
a.OriginalAmount = a.OriginalAmount * a.CountRatio;
|
||
a.PositionAmount = a.PositionAmount * a.CountRatio;
|
||
}
|
||
|
||
});
|
||
var dc = new List<ExcelHelper.DataColumnModel>();
|
||
if (req.SummaryType == "场外期权")
|
||
{//场外期权
|
||
switch (type)
|
||
{
|
||
case "开仓明细":
|
||
#region 开仓导出列
|
||
dc.Add(new ExcelHelper.DataColumnModel("客户全称", "ClientFullName"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("订单", "TradeNumber"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("确认书编号", "ContractCode"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("状态", "Status", (cv, obj) => { return FormatValue("状态", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("看涨看跌", "OptionType"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("客户名", "ClientShortName"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("成交日", "TradeDate", (cv, obj) => { return FormatValue("成交日", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("成交手数", "OriginalLots", typeof(double), (cv, obj) => { return FormatValue("成交手数", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("成交数量", "OriginalAmount", typeof(double), (cv, obj) => { return FormatValue("成交数量", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("持仓数量", "PositionAmount", typeof(double), (cv, obj) => { return FormatValue("持仓数量", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("到期日", "ExerciseDate", (cv, obj) => { return FormatValue("到期日", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("我方买/卖", "TradeDirection"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("名义本金(期初价格)", "StockEqvNotional", typeof(double), (cv, obj) => { return FormatValue("名义本金", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("名义本金(执行价格)", "StockEqvNotional2", typeof(double), (cv, obj) => { return FormatValue("名义本金", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("期初权利金收支", "TradePrice", typeof(double), (cv, obj) => { return FormatValue("期初权利金收支", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("财务入账", "FinancialEntry", typeof(double)));
|
||
dc.Add(new ExcelHelper.DataColumnModel("交易确认书", "TradeConfirmFileStatus", (cv, obj) => { return FormatValue("交易确认书", cv, obj); }));
|
||
#endregion
|
||
break;
|
||
case "持仓明细":
|
||
#region 持仓导出列
|
||
dc.Add(new ExcelHelper.DataColumnModel("客户全称", "ClientFullName"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("订单", "TradeNumber"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("确认书编号", "ContractCode"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("状态", "Status", (cv, obj) => { return FormatValue("状态", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("看涨看跌", "OptionType"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("客户名", "ClientShortName"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("成交日", "TradeDate", (cv, obj) => { return FormatValue("成交日", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("成交手数", "OriginalLots", typeof(double), (cv, obj) => { return FormatValue("成交手数", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("成交数量", "OriginalAmount", typeof(double), (cv, obj) => { return FormatValue("成交数量", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("持仓数量", "PositionAmount", typeof(double), (cv, obj) => { return FormatValue("持仓数量", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("到期日", "ExerciseDate", (cv, obj) => { return FormatValue("到期日", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("我方买/卖", "TradeDirection"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("名义本金(期初价格)", "StockEqvNotional", typeof(double), (cv, obj) => { return FormatValue("名义本金", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("名义本金(执行价格)", "StockEqvNotional2", typeof(double), (cv, obj) => { return FormatValue("名义本金", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("期初权利金收支", "TradePrice", typeof(double), (cv, obj) => { return FormatValue("期初权利金收支", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("上期期末市值", "LastPv", typeof(double), (cv, obj) => { return FormatValue("上期期末市值", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("上期期末累计浮动盈亏", "LastTotalPnl", typeof(double), (cv, obj) => { return FormatValue("上期期末累计浮动盈亏", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("本期期末市值", "Pv", typeof(double), (cv, obj) => { return FormatValue("本期期末市值", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("本期期末累计浮动盈亏", "TotalPnl", typeof(double), (cv, obj) => { return FormatValue("本期期末累计浮动盈亏", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("本期浮动盈亏", "Pnl", typeof(double), (cv, obj) => { return FormatValue("本期浮动盈亏", cv, obj); }));
|
||
#endregion
|
||
break;
|
||
case "平仓明细":
|
||
#region 平仓导出列
|
||
dc.Add(new ExcelHelper.DataColumnModel("客户全称", "ClientFullName"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("订单", "TradeNumber"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("确认书编号", "ContractCode"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("结算书编号", "SettlementCode"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("状态", "Status", (cv, obj) => { return FormatValue("状态", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("看涨看跌", "OptionType"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("客户名", "ClientShortName"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("成交日", "TradeDate", (cv, obj) => { return FormatValue("成交日", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("成交手数", "OriginalLots", typeof(double), (cv, obj) => { return FormatValue("成交手数", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("成交数量", "OriginalAmount", typeof(double), (cv, obj) => { return FormatValue("成交数量", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("到期日", "ExerciseDate", (cv, obj) => { return FormatValue("到期日", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("清算日期", "ClearDate", (cv, obj) => { return FormatValue("清算日期", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("我方买/卖", "TradeDirection"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("名义本金(期初价格)", "StockEqvNotional", typeof(double), (cv, obj) => { return FormatValue("名义本金", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("名义本金(执行价格)", "StockEqvNotional2", typeof(double), (cv, obj) => { return FormatValue("名义本金", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("期初权利金收支", "TradePrice", typeof(double), (cv, obj) => { return FormatValue("期初权利金收支", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("清算金额", "ClearPrice", typeof(double), (cv, obj) => { return FormatValue("清算金额", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("我方期权清算盈亏", "ConfirmPnl", typeof(double), (cv, obj) => { return FormatValue("我方期权清算盈亏", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("上期期末市值", "LastPv", typeof(double), (cv, obj) => { return FormatValue("上期期末市值", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("上期期末累计浮动盈亏", "LastTotalPnl", typeof(double), (cv, obj) => { return FormatValue("上期期末累计浮动盈亏", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("本期浮动盈亏", "Pnl", typeof(double), (cv, obj) => { return FormatValue("本期浮动盈亏", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("财务入账", "FinancialEntry", typeof(double)));
|
||
dc.Add(new ExcelHelper.DataColumnModel("交易确认书", "TradeConfirmFileStatus", (cv, obj) => { return FormatValue("交易确认书", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("结算确认书", "ClearConfirmFileStatus", (cv, obj) => { return FormatValue("结算确认书", cv, obj); }));
|
||
#endregion
|
||
break;
|
||
default:
|
||
#region 默认导出列
|
||
dc.Add(new ExcelHelper.DataColumnModel("客户全称", "ClientFullName"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("订单", "TradeNumber"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("确认书编号", "ContractCode"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("结算书编号", "SettlementCode"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("状态", "Status", (cv, obj) => { return FormatValue("状态", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("看涨看跌", "OptionType"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("客户名", "ClientShortName"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("成交日", "TradeDate", (cv, obj) => { return FormatValue("成交日", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("成交手数", "OriginalLots", typeof(double), (cv, obj) => { return FormatValue("成交手数", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("成交数量", "OriginalAmount", typeof(double), (cv, obj) => { return FormatValue("成交数量", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("持仓数量", "PositionAmount", typeof(double), (cv, obj) => { return FormatValue("持仓数量", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("到期日", "ExerciseDate", (cv, obj) => { return FormatValue("到期日", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("清算日期", "ClearDate", (cv, obj) => { return FormatValue("清算日期", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("我方买/卖", "TradeDirection"));
|
||
//dc.Add(new ExcelHelper.DataColumnModel("权益商品", "UnderlyingInstrumentType"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("标的", "UnderlyingCode"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("期权类型", "ExerciseMode"));
|
||
if (!PS.Config.Is光大光子)
|
||
{
|
||
dc.Add(new ExcelHelper.DataColumnModel("名义本金", "StockEqvNotional3", typeof(double), (cv, obj) => { return FormatValue("名义本金", cv, obj); }));
|
||
}
|
||
dc.Add(new ExcelHelper.DataColumnModel("名义本金(期初价格)", "StockEqvNotional", typeof(double), (cv, obj) => { return FormatValue("名义本金", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("名义本金(执行价格)", "StockEqvNotional2", typeof(double), (cv, obj) => { return FormatValue("名义本金", cv, obj); }));
|
||
if (PS.Config.Is国海)
|
||
{
|
||
dc.Add(new ExcelHelper.DataColumnModel("存续名义本金", "SurvivingNominalPrincipal", typeof(double), (cv, obj) => { return FormatValue("名义本金", cv, obj); }));
|
||
}
|
||
//dc.Add(new ExcelHelper.cDataColumn("名义本金(万元)", "StockEqvNotional", typeof(double), (cv, obj) => { return FormatValue("名义本金(万元)", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("期初权利金收支", "TradePrice", typeof(double), (cv, obj) => { return FormatValue("期初权利金收支", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("清算金额", "ClearPrice", typeof(double), (cv, obj) => { return FormatValue("清算金额", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("我方期权清算盈亏", "ConfirmPnl", typeof(double), (cv, obj) => { return FormatValue("我方期权清算盈亏", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("上期期末市值", "LastPv", typeof(double), (cv, obj) => { return FormatValue("上期期末市值", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("上期期末累计浮动盈亏", "LastTotalPnl", typeof(double), (cv, obj) => { return FormatValue("上期期末累计浮动盈亏", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("本期期末市值", "Pv", typeof(double), (cv, obj) => { return FormatValue("本期期末市值", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("本期期末累计浮动盈亏", "TotalPnl", typeof(double), (cv, obj) => { return FormatValue("本期期末累计浮动盈亏", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("本期浮动盈亏", "Pnl", typeof(double), (cv, obj) => { return FormatValue("本期浮动盈亏", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("期货盈亏(结算价)", "FuturePnl", typeof(double), (cv, obj) => { return FormatValue("期货盈亏(结算价)", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("交易确认书", "TradeConfirmFileStatus", (cv, obj) => { return FormatValue("交易确认书", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("结算确认书", "ClearConfirmFileStatus", (cv, obj) => { return FormatValue("结算确认书", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("财务入账", "FinancialEntry", typeof(double)));
|
||
dc.Add(new ExcelHelper.DataColumnModel("交易确认日期", "TradeConfirmDate", (cv, obj) => { return FormatValue("交易确认日期", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("了结确认日期", "ClearConfirmDate", (cv, obj) => { return FormatValue("了结确认日期", cv, obj); }));
|
||
#endregion
|
||
break;
|
||
}
|
||
}
|
||
else
|
||
{//远期/掉期 互换
|
||
switch (type)
|
||
{
|
||
case "开仓明细":
|
||
#region 开仓导出列
|
||
dc.Add(new ExcelHelper.DataColumnModel("客户全称", "ClientFullName"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("订单", "TradeNumber"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("确认书编号", "ContractCode"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("状态", "Status", (cv, obj) => { return FormatValue("状态", cv, obj); }));
|
||
if (req.SummaryType == "远期/掉期")
|
||
{
|
||
dc.Add(new ExcelHelper.DataColumnModel("多空方向", "OptionType", (cv, obj) => { return FormatValue("多空方向", cv, obj); }));
|
||
}
|
||
dc.Add(new ExcelHelper.DataColumnModel("客户名", "ClientShortName"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("成交日", "TradeDate", (cv, obj) => { return FormatValue("成交日", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("成交手数", "OriginalLots", typeof(double), (cv, obj) => { return FormatValue("成交手数", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("成交数量", "OriginalAmount", typeof(double), (cv, obj) => { return FormatValue("成交数量", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("持仓数量", "PositionAmount", typeof(double), (cv, obj) => { return FormatValue("持仓数量", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("到期日", "ExerciseDate", (cv, obj) => { return FormatValue("到期日", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("我方买/卖", "TradeDirection"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("名义本金", "StockEqvNotional", typeof(double), (cv, obj) => { return FormatValue("名义本金", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("开仓费用", "TradePrice", typeof(double), (cv, obj) => { return FormatValue("期初权利金收支", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("财务入账", "FinancialEntry", typeof(double)));
|
||
dc.Add(new ExcelHelper.DataColumnModel("交易确认书", "TradeConfirmFileStatus", (cv, obj) => { return FormatValue("交易确认书", cv, obj); }));
|
||
#endregion
|
||
break;
|
||
case "持仓明细":
|
||
#region 持仓导出列
|
||
dc.Add(new ExcelHelper.DataColumnModel("客户全称", "ClientFullName"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("订单", "TradeNumber"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("确认书编号", "ContractCode"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("状态", "Status", (cv, obj) => { return FormatValue("状态", cv, obj); }));
|
||
if (req.SummaryType == "远期/掉期")
|
||
{
|
||
dc.Add(new ExcelHelper.DataColumnModel("多空方向", "OptionType", (cv, obj) => { return FormatValue("多空方向", cv, obj); }));
|
||
}
|
||
dc.Add(new ExcelHelper.DataColumnModel("客户名", "ClientShortName"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("成交日", "TradeDate", (cv, obj) => { return FormatValue("成交日", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("成交手数", "OriginalLots", typeof(double), (cv, obj) => { return FormatValue("成交手数", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("成交数量", "OriginalAmount", typeof(double), (cv, obj) => { return FormatValue("成交数量", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("持仓数量", "PositionAmount", typeof(double), (cv, obj) => { return FormatValue("持仓数量", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("到期日", "ExerciseDate", (cv, obj) => { return FormatValue("到期日", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("我方买/卖", "TradeDirection"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("名义本金", "StockEqvNotional", typeof(double), (cv, obj) => { return FormatValue("名义本金", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("开仓费用", "TradePrice", typeof(double), (cv, obj) => { return FormatValue("期初权利金收支", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("上期期末市值", "LastPv", typeof(double), (cv, obj) => { return FormatValue("上期期末市值", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("上期期末累计浮动盈亏", "LastTotalPnl", typeof(double), (cv, obj) => { return FormatValue("上期期末累计浮动盈亏", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("本期期末市值", "Pv", typeof(double), (cv, obj) => { return FormatValue("本期期末市值", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("本期期末累计浮动盈亏", "TotalPnl", typeof(double), (cv, obj) => { return FormatValue("本期期末累计浮动盈亏", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("本期浮动盈亏", "Pnl", typeof(double), (cv, obj) => { return FormatValue("本期浮动盈亏", cv, obj); }));
|
||
#endregion
|
||
break;
|
||
case "平仓明细":
|
||
#region 平仓导出列
|
||
dc.Add(new ExcelHelper.DataColumnModel("客户全称", "ClientFullName"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("订单", "TradeNumber"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("确认书编号", "ContractCode"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("结算书编号", "SettlementCode"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("状态", "Status", (cv, obj) => { return FormatValue("状态", cv, obj); }));
|
||
if (req.SummaryType == "远期/掉期")
|
||
{
|
||
dc.Add(new ExcelHelper.DataColumnModel("多空方向", "OptionType", (cv, obj) => { return FormatValue("多空方向", cv, obj); }));
|
||
}
|
||
dc.Add(new ExcelHelper.DataColumnModel("客户名", "ClientShortName"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("成交日", "TradeDate", (cv, obj) => { return FormatValue("成交日", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("成交手数", "OriginalLots", typeof(double), (cv, obj) => { return FormatValue("成交手数", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("成交数量", "OriginalAmount", typeof(double), (cv, obj) => { return FormatValue("成交数量", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("到期日", "ExerciseDate", (cv, obj) => { return FormatValue("到期日", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("清算日期", "ClearDate", (cv, obj) => { return FormatValue("清算日期", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("我方买/卖", "TradeDirection"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("名义本金", "StockEqvNotional", typeof(double), (cv, obj) => { return FormatValue("名义本金", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("开仓费用", "TradePrice", typeof(double), (cv, obj) => { return FormatValue("期初权利金收支", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("清算金额", "ClearPrice", typeof(double), (cv, obj) => { return FormatValue("清算金额", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("我方期权清算盈亏", "ConfirmPnl", typeof(double), (cv, obj) => { return FormatValue("我方期权清算盈亏", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("上期期末市值", "LastPv", typeof(double), (cv, obj) => { return FormatValue("上期期末市值", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("上期期末累计浮动盈亏", "LastTotalPnl", typeof(double), (cv, obj) => { return FormatValue("上期期末累计浮动盈亏", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("本期浮动盈亏", "Pnl", typeof(double), (cv, obj) => { return FormatValue("本期浮动盈亏", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("财务入账", "FinancialEntry", typeof(double)));
|
||
dc.Add(new ExcelHelper.DataColumnModel("交易确认书", "TradeConfirmFileStatus", (cv, obj) => { return FormatValue("交易确认书", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("结算确认书", "ClearConfirmFileStatus", (cv, obj) => { return FormatValue("结算确认书", cv, obj); }));
|
||
#endregion
|
||
break;
|
||
default:
|
||
#region 默认导出列
|
||
dc.Add(new ExcelHelper.DataColumnModel("客户全称", "ClientFullName"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("订单", "TradeNumber"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("确认书编号", "ContractCode"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("结算书编号", "SettlementCode"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("状态", "Status", (cv, obj) => { return FormatValue("状态", cv, obj); }));
|
||
if (req.SummaryType == "远期/掉期")
|
||
{
|
||
dc.Add(new ExcelHelper.DataColumnModel("多空方向", "OptionType", (cv, obj) => { return FormatValue("多空方向", cv, obj); }));
|
||
}
|
||
dc.Add(new ExcelHelper.DataColumnModel("客户名", "ClientShortName"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("成交日", "TradeDate", (cv, obj) => { return FormatValue("成交日", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("成交手数", "OriginalLots", typeof(double), (cv, obj) => { return FormatValue("成交手数", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("成交数量", "OriginalAmount", typeof(double), (cv, obj) => { return FormatValue("成交数量", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("持仓数量", "PositionAmount", typeof(double), (cv, obj) => { return FormatValue("持仓数量", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("到期日", "ExerciseDate", (cv, obj) => { return FormatValue("到期日", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("清算日期", "ClearDate", (cv, obj) => { return FormatValue("清算日期", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("我方买/卖", "TradeDirection"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("标的", "UnderlyingCode"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("名义本金", "StockEqvNotional", typeof(double), (cv, obj) => { return FormatValue("名义本金", cv, obj); }));
|
||
if (PS.Config.Is国海)
|
||
{
|
||
dc.Add(new ExcelHelper.DataColumnModel("存续名义本金", "SurvivingNominalPrincipal", typeof(double), (cv, obj) => { return FormatValue("名义本金", cv, obj); }));
|
||
}
|
||
//dc.Add(new ExcelHelper.cDataColumn("名义本金(万元)", "StockEqvNotional", typeof(double), (cv, obj) => { return FormatValue("名义本金(万元)", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("开仓费用", "TradePrice", typeof(double), (cv, obj) => { return FormatValue("期初权利金收支", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("清算金额", "ClearPrice", typeof(double), (cv, obj) => { return FormatValue("清算金额", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("我方期权清算盈亏", "ConfirmPnl", typeof(double), (cv, obj) => { return FormatValue("我方期权清算盈亏", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("上期期末市值", "LastPv", typeof(double), (cv, obj) => { return FormatValue("上期期末市值", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("上期期末累计浮动盈亏", "LastTotalPnl", typeof(double), (cv, obj) => { return FormatValue("上期期末累计浮动盈亏", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("本期期末市值", "Pv", typeof(double), (cv, obj) => { return FormatValue("本期期末市值", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("本期期末累计浮动盈亏", "TotalPnl", typeof(double), (cv, obj) => { return FormatValue("本期期末累计浮动盈亏", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("本期浮动盈亏", "Pnl", typeof(double), (cv, obj) => { return FormatValue("本期浮动盈亏", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("交易确认书", "TradeConfirmFileStatus", (cv, obj) => { return FormatValue("交易确认书", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("结算确认书", "ClearConfirmFileStatus", (cv, obj) => { return FormatValue("结算确认书", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("财务入账", "FinancialEntry", typeof(double)));
|
||
if (req.SummaryType == "远期/掉期")
|
||
{
|
||
dc.Add(new ExcelHelper.DataColumnModel("交易确认日期", "TradeConfirmDate", (cv, obj) => { return FormatValue("交易确认日期", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("了结确认日期", "ClearConfirmDate", (cv, obj) => { return FormatValue("了结确认日期", cv, obj); }));
|
||
}
|
||
#endregion
|
||
break;
|
||
}
|
||
}
|
||
|
||
new ExcelHelper().ListToExcel(dc.ToArray(), list, "Sheet1", true, out buffer);
|
||
return File(buffer, xlsxMimeType);
|
||
}
|
||
|
||
public ActionResult DownloadFinancialSummary(FinancialSummaryModelReq req, string type, bool query = false)
|
||
{
|
||
if (query)
|
||
{
|
||
req.rows = 1;
|
||
}
|
||
|
||
if (string.IsNullOrWhiteSpace(type))
|
||
{
|
||
type = "财务汇总";
|
||
}
|
||
|
||
try
|
||
{
|
||
byte[] buffer = null;
|
||
ActionResult obj = null;
|
||
|
||
switch (req.SummaryType)
|
||
{
|
||
case "场内期权":
|
||
obj = DownloadFinancialExangeSummary(req, type, out buffer, query);
|
||
break;
|
||
case "远期/掉期":
|
||
case "场外期权":
|
||
default:
|
||
obj = DownloadFinancialOptionSummary(req, type, out buffer, query);
|
||
break;
|
||
}
|
||
if (buffer == null)
|
||
{
|
||
return obj;
|
||
}
|
||
else
|
||
{
|
||
return File(buffer, "application/ms-excel", $"{type}-{DateTime.Now:yyyy-MM-dd}.xlsx");
|
||
}
|
||
}
|
||
catch (Exception e)
|
||
{
|
||
return ShowError("下载失败" + e.Message);
|
||
}
|
||
}
|
||
|
||
#region 广发财务汇总导出
|
||
public ActionResult DownloadFinancialSummary_GF(FinancialSummaryModelReq req, string type, bool query = false)
|
||
{
|
||
if (query)
|
||
{
|
||
req.rows = 1;
|
||
}
|
||
|
||
if (string.IsNullOrWhiteSpace(type))
|
||
{
|
||
type = "财务汇总";
|
||
}
|
||
|
||
try
|
||
{
|
||
byte[] buffer = null;
|
||
ActionResult obj = null;
|
||
|
||
switch (req.SummaryType)
|
||
{
|
||
case "场内期权":
|
||
obj = DownloadFinancialExangeSummary_GF(req, type, out buffer, query);
|
||
break;
|
||
case "簿记维度":
|
||
obj = DownloadFinancialUnitSummary_GF(req, type, out buffer, query);
|
||
break;
|
||
case "远期/掉期":
|
||
case "场外期权":
|
||
default:
|
||
obj = DownloadFinancialOptionSummary_GF(req, type, out buffer, query);
|
||
break;
|
||
|
||
}
|
||
if (buffer == null)
|
||
{
|
||
return obj;
|
||
}
|
||
else
|
||
{
|
||
return File(buffer, "application/ms-excel", $"{type}-{DateTime.Now:yyyy-MM-dd}.xlsx");
|
||
}
|
||
}
|
||
catch (Exception e)
|
||
{
|
||
return ShowError("下载失败" + e.Message);
|
||
}
|
||
}
|
||
|
||
public ActionResult DownloadFinancialUnitSummary_GF(FinancialSummaryModelReq req, string type, bool query = false)
|
||
{
|
||
if (query)
|
||
{
|
||
req.rows = 1;
|
||
}
|
||
|
||
if (string.IsNullOrWhiteSpace(type))
|
||
{
|
||
type = "财务汇总";
|
||
}
|
||
|
||
try
|
||
{
|
||
byte[] buffer = null;
|
||
ActionResult obj = DownloadFinancialUnitSummary_GF(req, type, out buffer, query);
|
||
|
||
if (buffer == null)
|
||
{
|
||
return obj;
|
||
}
|
||
else
|
||
{
|
||
return File(buffer, "application/ms-excel", $"{type}-{DateTime.Now:yyyy-MM-dd}.xlsx");
|
||
}
|
||
}
|
||
catch (Exception e)
|
||
{
|
||
return ShowError("下载失败" + e.Message);
|
||
}
|
||
}
|
||
|
||
|
||
private ActionResult DownloadFinancialUnitSummary_GF(FinancialSummaryModelReq req, string type, out byte[] buffer, bool query = false)
|
||
{
|
||
buffer = null;
|
||
if (!(new FinancialVoucherService(CurUser).GatherUnitData(req) is List<FinancialSummaryOptionModel> searchList))
|
||
{
|
||
return Json(Return.Fail("数据不存在"));
|
||
}
|
||
var list = searchList.ToList();
|
||
if (query)//如果只是查询数据是否存在,则只返回错误信息或数量;
|
||
{
|
||
if (list.Count > 0) { return Json(Return.Success(searchList.Count.ToString())); }
|
||
else { return Json(Return.Fail("数据不存在")); }
|
||
}
|
||
if (list.Count == 0) { return ShowError("数据不存在"); }
|
||
var xiaojiRowStyle = new ListToExcelRowStyle
|
||
{
|
||
FontBold = false,
|
||
BackgroundColor = Color.FromArgb(217, 225, 242),
|
||
};
|
||
//var hejiRowStyle = new ListToExcelRowStyle
|
||
//{
|
||
// FontBold = true
|
||
//};
|
||
var rowStyleDic = new Dictionary<int, ListToExcelRowStyle>();
|
||
|
||
foreach (var item in list.Where(l => l.AssetBookName.Contains("小计")))
|
||
{
|
||
var i = list.FindIndex(l => l == item);
|
||
rowStyleDic[i] = xiaojiRowStyle;
|
||
}
|
||
var dc = new List<ExcelHelper.DataColumnModel>();
|
||
dc.Add(new ExcelHelper.DataColumnModel("簿记账户", "AssetBookName"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("品种代码", "VarietyCode"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("持仓手数", "PositionLots", typeof(string), (cv, obj) => { return FormatValue_GF("成交手数", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("持仓数量", "PositionAmount", typeof(string), (cv, obj) => { return FormatValue_GF("持仓数量", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("名义本金", "StockEqvNotional3", typeof(string), (cv, obj) => { return FormatValue_GF("名义本金", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("期初权利金收支", "TradePrice", typeof(double), (cv, obj) => { return FormatValue_GF("期初权利金收支", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("清算金额", "ClearPrice", typeof(double), (cv, obj) => { return FormatValue_GF("清算金额", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("我方期权清算盈亏", "ConfirmPnl", typeof(double), (cv, obj) => { return FormatValue_GF("我方期权清算盈亏", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("上期期末市值", "LastPv", typeof(double), (cv, obj) => { return FormatValue_GF("上期期末市值", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("上期期末累计浮动盈亏", "LastTotalPnl", typeof(double), (cv, obj) => { return FormatValue_GF("上期期末累计浮动盈亏", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("本期期末市值", "Pv", typeof(double), (cv, obj) => { return FormatValue_GF("本期期末市值", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("本期期末累计浮动盈亏", "TotalPnl", typeof(double), (cv, obj) => { return FormatValue_GF("本期期末累计浮动盈亏", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("本期浮动盈亏", "GF_Pnl", typeof(double), (cv, obj) => { return FormatValue_GF("本期浮动盈亏", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("当日期货盈亏", "DailyPnL", typeof(double), (cv, obj) => { return FormatValue_GF("当日期货盈亏", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("手续费", "ServiceFee", typeof(double), (cv, obj) => { return FormatValue_GF("手续费", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("累计总盈亏", "NewTotalPnl", typeof(double), (cv, obj) => { return FormatValue_GF("累计总盈亏", cv, obj); }));
|
||
var req1 = new ListToExcelRequest<FinancialSummaryOptionModel>
|
||
{
|
||
Columns = dc,
|
||
ColumnAutoSize = false,
|
||
DataGroups = null,
|
||
Datas = list,
|
||
IsColumnWritten = true,
|
||
GetRowStyle = dataIndex => rowStyleDic.TryGetValue(dataIndex, out var style) ? style : null,
|
||
SheetName = "Sheet1"
|
||
};
|
||
var result = new ExcelHelper().ListToExcel(req1);
|
||
buffer = result.Buffer;
|
||
//new ExcelHelper().ListToExcel(dc.ToArray(), list, "Sheet1", true, out buffer);
|
||
return File(result.Buffer, xlsxMimeType);
|
||
}
|
||
private ActionResult DownloadFinancialExangeSummary_GF(FinancialSummaryModelReq req, string type, out byte[] buffer, bool query = false)
|
||
{
|
||
buffer = null;
|
||
if (!(FinancialSummaryQuery_GF(req).Value is SearchListResult<FinancialSummaryExchangeModel> searchList))
|
||
{
|
||
return Json(Return.Fail("数据不存在"));
|
||
}
|
||
var list = searchList.rows.ToList();
|
||
if (query)//如果只是查询数据是否存在,则只返回错误信息或数量;
|
||
{
|
||
if (list.Count > 0)
|
||
{
|
||
return Json(Return.Success(searchList.records.ToString()));
|
||
}
|
||
else { return Json(Return.Fail("数据不存在")); }
|
||
}
|
||
if (list.Count == 0) { return ShowError("数据不存在"); }
|
||
|
||
var modelDict = new Dictionary<string, object>
|
||
{
|
||
["Sheet1"] = new
|
||
{
|
||
searchList.Sum,
|
||
InfoList = list
|
||
}
|
||
};
|
||
var sourcePath = OtcAppContext.MapPath("~/App_Docs");
|
||
var settleDocName = "财务汇总-场内期权.xlsx";
|
||
var sourceFileName = Path.Combine(sourcePath, settleDocName);
|
||
//var targetPath = Path.Combine(sourcePath, "temp");
|
||
//var targetFileName = $"财务汇总-场内期权{DateTime.Now.ToString("yyyyMMddHHmmss")}.xlsx";
|
||
buffer = new ExcelTemplateGenerator().SetTemplateFile(sourceFileName).SetTemplateData(modelDict).Output();
|
||
return File(buffer, xlsxMimeType);
|
||
}
|
||
|
||
private ActionResult DownloadFinancialOptionSummary_GF(FinancialSummaryModelReq req, string type, out byte[] buffer, bool query = false)
|
||
{
|
||
buffer = null;
|
||
if (!(new FinancialVoucherService(CurUser).GatherClientData(req) is List<FinancialSummaryOptionModel> searchList))
|
||
{
|
||
return Json(Return.Fail("数据不存在"));
|
||
}
|
||
var list = searchList.ToList();
|
||
|
||
|
||
if (query)//如果只是查询数据是否存在,则只返回错误信息或数量;
|
||
{
|
||
if (list.Count > 0) { return Json(Return.Success(searchList.Count.ToString())); }
|
||
else { return Json(Return.Fail("数据不存在")); }
|
||
}
|
||
if (list.Count == 0) { return ShowError("数据不存在"); }
|
||
var xiaojiRowStyle = new ListToExcelRowStyle
|
||
{
|
||
FontBold = false,
|
||
BackgroundColor = Color.FromArgb(217, 225, 242),
|
||
};
|
||
//var hejiRowStyle = new ListToExcelRowStyle
|
||
//{
|
||
// FontBold = true
|
||
//};
|
||
var rowStyleDic = new Dictionary<int, ListToExcelRowStyle>();
|
||
|
||
foreach (var item in list.Where(l => l.ClientFullName.Contains("小计")))
|
||
{
|
||
var i = list.FindIndex(l => l == item);
|
||
rowStyleDic[i] = xiaojiRowStyle;
|
||
}
|
||
|
||
list.ForEach(a =>
|
||
{
|
||
if (PS.Config.IsUseDisplayNotional)
|
||
{
|
||
a.OriginalAmount = a.OriginalAmount * a.CountRatio;
|
||
a.PositionAmount = a.PositionAmount * a.CountRatio;
|
||
}
|
||
|
||
});
|
||
var dc = new List<ExcelHelper.DataColumnModel>();
|
||
if (req.SummaryType == "场外期权")
|
||
{//场外期权
|
||
switch (type)
|
||
{
|
||
//GF_Pnl
|
||
case "开仓明细":
|
||
#region 开仓导出列
|
||
dc.Add(new ExcelHelper.DataColumnModel("客户全称", "ClientFullName"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("簿记账户", "AssetBookName"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("订单", "TradeNumber"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("确认书编号", "ContractCode"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("状态", "StatusStr", (cv, obj) => { return FormatValue_GF("状态", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("看涨看跌", "OptionType", (cv, obj) => { return FormatValue_GF("看涨看跌", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("客户名", "ClientShortName"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("成交日", "TradeDate", (cv, obj) => { return FormatValue_GF("成交日", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("成交手数", "OriginalLots", typeof(string), (cv, obj) => { return FormatValue_GF("成交手数", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("成交数量", "OriginalAmount", typeof(string), (cv, obj) => { return FormatValue_GF("成交数量", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("持仓数量", "PositionAmount", typeof(string), (cv, obj) => { return FormatValue_GF("持仓数量", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("到期日", "ExerciseDate", (cv, obj) => { return FormatValue_GF("到期日", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("我方买/卖", "TradeDirection"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("名义本金(期初价格)", "StockEqvNotional", typeof(double), (cv, obj) => { return FormatValue_GF("名义本金", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("名义本金(执行价格)", "StockEqvNotional2", typeof(string), (cv, obj) => { return FormatValue_GF("名义本金", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("期初权利金收支", "TradePrice", typeof(double), (cv, obj) => { return FormatValue_GF("期初权利金收支", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("财务入账", "FinancialEntry", typeof(double)));
|
||
dc.Add(new ExcelHelper.DataColumnModel("可用资金(财务)", "AvailableCash", typeof(string), (cv, obj) => { return FormatValue_GF("可用资金(财务)", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("期末结存(财务)", "EndBalance", typeof(string), (cv, obj) => { return FormatValue_GF("期末结存(财务)", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("交易确认书", "TradeConfirmFileStatus", (cv, obj) => { return FormatValue_GF("交易确认书", cv, obj); }));
|
||
#endregion
|
||
break;
|
||
case "持仓明细":
|
||
#region 持仓导出列
|
||
dc.Add(new ExcelHelper.DataColumnModel("客户全称", "ClientFullName"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("簿记账户", "AssetBookName"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("订单", "TradeNumber"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("确认书编号", "ContractCode"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("状态", "StatusStr", (cv, obj) => { return FormatValue_GF("状态", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("看涨看跌", "OptionType", (cv, obj) => { return FormatValue_GF("看涨看跌", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("客户名", "ClientShortName"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("成交日", "TradeDate", (cv, obj) => { return FormatValue_GF("成交日", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("成交手数", "OriginalLots", typeof(string), (cv, obj) => { return FormatValue_GF("成交手数", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("成交数量", "OriginalAmount", typeof(string), (cv, obj) => { return FormatValue_GF("成交数量", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("持仓数量", "PositionAmount", typeof(string), (cv, obj) => { return FormatValue_GF("持仓数量", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("到期日", "ExerciseDate", (cv, obj) => { return FormatValue_GF("到期日", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("我方买/卖", "TradeDirection"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("名义本金(期初价格)", "StockEqvNotional", typeof(double), (cv, obj) => { return FormatValue_GF("名义本金", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("名义本金(执行价格)", "StockEqvNotional2", typeof(string), (cv, obj) => { return FormatValue_GF("名义本金", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("期初权利金收支", "TradePrice", typeof(double), (cv, obj) => { return FormatValue_GF("期初权利金收支", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("上期期末市值", "LastPv", typeof(double), (cv, obj) => { return FormatValue_GF("上期期末市值", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("上期期末累计浮动盈亏", "LastTotalPnl", typeof(double), (cv, obj) => { return FormatValue_GF("上期期末累计浮动盈亏", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("本期期末市值", "Pv", typeof(double), (cv, obj) => { return FormatValue_GF("本期期末市值", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("本期期末累计浮动盈亏", "TotalPnl", typeof(double), (cv, obj) => { return FormatValue_GF("本期期末累计浮动盈亏", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("本期浮动盈亏", "GF_Pnl", typeof(double), (cv, obj) => { return FormatValue_GF("本期浮动盈亏", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("可用资金(财务)", "AvailableCash", typeof(string), (cv, obj) => { return FormatValue_GF("可用资金(财务)", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("期末结存(财务)", "EndBalance", typeof(string), (cv, obj) => { return FormatValue_GF("期末结存(财务)", cv, obj); }));
|
||
#endregion
|
||
break;
|
||
case "平仓明细":
|
||
#region 平仓导出列
|
||
dc.Add(new ExcelHelper.DataColumnModel("客户全称", "ClientFullName"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("簿记账户", "AssetBookName"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("订单", "TradeNumber"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("确认书编号", "ContractCode"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("结算书编号", "SettlementCode"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("状态", "StatusStr", (cv, obj) => { return FormatValue_GF("状态", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("看涨看跌", "OptionType", (cv, obj) => { return FormatValue_GF("看涨看跌", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("客户名", "ClientShortName"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("成交日", "TradeDate", (cv, obj) => { return FormatValue_GF("成交日", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("成交手数", "OriginalLots", typeof(string), (cv, obj) => { return FormatValue_GF("成交手数", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("成交数量", "OriginalAmount", typeof(string), (cv, obj) => { return FormatValue_GF("成交数量", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("到期日", "ExerciseDate", (cv, obj) => { return FormatValue_GF("到期日", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("清算日期", "ClearDate", (cv, obj) => { return FormatValue_GF("清算日期", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("我方买/卖", "TradeDirection"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("名义本金(期初价格)", "StockEqvNotional", typeof(double), (cv, obj) => { return FormatValue_GF("名义本金", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("名义本金(执行价格)", "StockEqvNotional2", typeof(string), (cv, obj) => { return FormatValue_GF("名义本金", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("期初权利金收支", "TradePrice", typeof(double), (cv, obj) => { return FormatValue_GF("期初权利金收支", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("清算金额", "ClearPrice", typeof(double), (cv, obj) => { return FormatValue_GF("清算金额", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("我方期权清算盈亏", "ConfirmPnl", typeof(double), (cv, obj) => { return FormatValue_GF("我方期权清算盈亏", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("上期期末市值", "LastPv", typeof(double), (cv, obj) => { return FormatValue_GF("上期期末市值", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("上期期末累计浮动盈亏", "LastTotalPnl", typeof(double), (cv, obj) => { return FormatValue_GF("上期期末累计浮动盈亏", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("本期浮动盈亏", "GF_Pnl", typeof(double), (cv, obj) => { return FormatValue_GF("本期浮动盈亏", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("财务入账", "FinancialEntry", typeof(double)));
|
||
dc.Add(new ExcelHelper.DataColumnModel("可用资金(财务)", "AvailableCash", typeof(string), (cv, obj) => { return FormatValue_GF("可用资金(财务)", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("期末结存(财务)", "EndBalance", typeof(string), (cv, obj) => { return FormatValue_GF("期末结存(财务)", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("交易确认书", "TradeConfirmFileStatus", (cv, obj) => { return FormatValue_GF("交易确认书", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("结算确认书", "ClearConfirmFileStatus", (cv, obj) => { return FormatValue_GF("结算确认书", cv, obj); }));
|
||
#endregion
|
||
break;
|
||
default:
|
||
#region 默认导出列
|
||
dc.Add(new ExcelHelper.DataColumnModel("客户全称", "ClientFullName"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("簿记账户", "AssetBookName"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("订单", "TradeNumber"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("确认书编号", "ContractCode"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("结算书编号", "SettlementCode"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("状态", "StatusStr", (cv, obj) => { return FormatValue_GF("状态", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("看涨看跌", "OptionType", (cv, obj) => { return FormatValue_GF("看涨看跌", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("客户名", "ClientShortName"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("成交日", "TradeDate", (cv, obj) => { return FormatValue_GF("成交日", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("成交手数", "OriginalLots", typeof(string), (cv, obj) => { return FormatValue_GF("成交手数", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("成交数量", "OriginalAmount", typeof(string), (cv, obj) => { return FormatValue_GF("成交数量", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("持仓数量", "PositionAmount", typeof(string), (cv, obj) => { return FormatValue_GF("持仓数量", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("到期日", "ExerciseDate", (cv, obj) => { return FormatValue_GF("到期日", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("清算日期", "ClearDate", (cv, obj) => { return FormatValue_GF("清算日期", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("我方买/卖", "TradeDirection"));
|
||
//dc.Add(new ExcelHelper.DataColumnModel("权益商品", "UnderlyingInstrumentType"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("标的", "UnderlyingCode"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("期权类型", "ExerciseMode"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("名义本金", "StockEqvNotional3", typeof(string), (cv, obj) => { return FormatValue_GF("名义本金", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("名义本金(期初价格)", "StockEqvNotional", typeof(double), (cv, obj) => { return FormatValue_GF("名义本金", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("名义本金(执行价格)", "StockEqvNotional2", typeof(string), (cv, obj) => { return FormatValue_GF("名义本金", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("期初权利金收支", "TradePrice", typeof(double), (cv, obj) => { return FormatValue_GF("期初权利金收支", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("清算金额", "ClearPrice", typeof(double), (cv, obj) => { return FormatValue_GF("清算金额", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("我方期权清算盈亏", "ConfirmTotlePnl", typeof(double), (cv, obj) => { return FormatValue_GF("我方期权清算盈亏", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("上期期末市值", "LastPv", typeof(double), (cv, obj) => { return FormatValue_GF("上期期末市值", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("上期期末累计浮动盈亏", "LastTotalPnl", typeof(double), (cv, obj) => { return FormatValue_GF("上期期末累计浮动盈亏", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("本期期末市值", "Pv", typeof(double), (cv, obj) => { return FormatValue_GF("本期期末市值", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("本期期末累计浮动盈亏", "TotalPnl", typeof(double), (cv, obj) => { return FormatValue_GF("本期期末累计浮动盈亏", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("本期浮动盈亏", "GF_Pnl", typeof(double), (cv, obj) => { return FormatValue_GF("本期浮动盈亏", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("期货盈亏(结算价)", "FuturePnl", typeof(double), (cv, obj) => { return FormatValue_GF("期货盈亏(结算价)", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("可用资金(财务)", "AvailableCash", typeof(string), (cv, obj) => { return FormatValue_GF("可用资金(财务)", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("期末结存(财务)", "EndBalance", typeof(string), (cv, obj) => { return FormatValue_GF("期末结存(财务)", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("交易确认书", "TradeConfirmFileStatus", (cv, obj) => { return FormatValue_GF("交易确认书", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("结算确认书", "ClearConfirmFileStatus", (cv, obj) => { return FormatValue_GF("结算确认书", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("财务入账", "FinancialEntry", typeof(double)));
|
||
dc.Add(new ExcelHelper.DataColumnModel("交易确认日期", "TradeConfirmDate", (cv, obj) => { return FormatValue_GF("交易确认日期", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("了结确认日期", "ClearConfirmDate", (cv, obj) => { return FormatValue_GF("了结确认日期", cv, obj); }));
|
||
#endregion
|
||
break;
|
||
}
|
||
}
|
||
else
|
||
{//远期/掉期 互换
|
||
switch (type)
|
||
{
|
||
case "开仓明细":
|
||
#region 开仓导出列
|
||
dc.Add(new ExcelHelper.DataColumnModel("客户全称", "ClientFullName"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("簿记账户", "AssetBookName"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("订单", "TradeNumber"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("确认书编号", "ContractCode"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("状态", "StatusStr", (cv, obj) => { return FormatValue_GF("状态", cv, obj); }));
|
||
if (req.SummaryType == "远期/掉期")
|
||
{
|
||
dc.Add(new ExcelHelper.DataColumnModel("多空方向", "OptionType", (cv, obj) => { return FormatValue_GF("多空方向", cv, obj); }));
|
||
}
|
||
dc.Add(new ExcelHelper.DataColumnModel("客户名", "ClientShortName"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("成交日", "TradeDate", (cv, obj) => { return FormatValue_GF("成交日", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("成交手数", "OriginalLots", typeof(string), (cv, obj) => { return FormatValue_GF("成交手数", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("成交数量", "OriginalAmount", typeof(string), (cv, obj) => { return FormatValue_GF("成交数量", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("持仓数量", "PositionAmount", typeof(string), (cv, obj) => { return FormatValue_GF("持仓数量", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("到期日", "ExerciseDate", (cv, obj) => { return FormatValue_GF("到期日", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("我方买/卖", "TradeDirection"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("名义本金", "StockEqvNotional", typeof(double), (cv, obj) => { return FormatValue_GF("名义本金", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("开仓费用", "TradePrice", typeof(double), (cv, obj) => { return FormatValue_GF("期初权利金收支", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("财务入账", "FinancialEntry", typeof(double)));
|
||
dc.Add(new ExcelHelper.DataColumnModel("可用资金(财务)", "AvailableCash", typeof(string), (cv, obj) => { return FormatValue_GF("可用资金(财务)", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("期末结存(财务)", "EndBalance", typeof(string), (cv, obj) => { return FormatValue_GF("期末结存(财务)", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("交易确认书", "TradeConfirmFileStatus", (cv, obj) => { return FormatValue_GF("交易确认书", cv, obj); }));
|
||
#endregion
|
||
break;
|
||
case "持仓明细":
|
||
#region 持仓导出列
|
||
dc.Add(new ExcelHelper.DataColumnModel("客户全称", "ClientFullName"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("簿记账户", "AssetBookName"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("订单", "TradeNumber"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("确认书编号", "ContractCode"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("状态", "StatusStr", (cv, obj) => { return FormatValue_GF("状态", cv, obj); }));
|
||
if (req.SummaryType == "远期/掉期")
|
||
{
|
||
dc.Add(new ExcelHelper.DataColumnModel("多空方向", "OptionType", (cv, obj) => { return FormatValue_GF("多空方向", cv, obj); }));
|
||
}
|
||
dc.Add(new ExcelHelper.DataColumnModel("客户名", "ClientShortName"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("成交日", "TradeDate", (cv, obj) => { return FormatValue_GF("成交日", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("成交手数", "OriginalLots", typeof(string), (cv, obj) => { return FormatValue_GF("成交手数", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("成交数量", "OriginalAmount", typeof(string), (cv, obj) => { return FormatValue_GF("成交数量", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("持仓数量", "PositionAmount", typeof(string), (cv, obj) => { return FormatValue_GF("持仓数量", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("到期日", "ExerciseDate", (cv, obj) => { return FormatValue_GF("到期日", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("我方买/卖", "TradeDirection"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("名义本金", "StockEqvNotional", typeof(double), (cv, obj) => { return FormatValue_GF("名义本金", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("开仓费用", "TradePrice", typeof(double), (cv, obj) => { return FormatValue_GF("期初权利金收支", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("上期期末市值", "LastPv", typeof(double), (cv, obj) => { return FormatValue_GF("上期期末市值", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("上期期末累计浮动盈亏", "LastTotalPnl", typeof(double), (cv, obj) => { return FormatValue_GF("上期期末累计浮动盈亏", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("本期期末市值", "Pv", typeof(double), (cv, obj) => { return FormatValue_GF("本期期末市值", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("本期期末累计浮动盈亏", "TotalPnl", typeof(double), (cv, obj) => { return FormatValue_GF("本期期末累计浮动盈亏", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("本期浮动盈亏", "GF_Pnl", typeof(double), (cv, obj) => { return FormatValue_GF("本期浮动盈亏", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("可用资金(财务)", "AvailableCash", typeof(string), (cv, obj) => { return FormatValue_GF("可用资金(财务)", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("期末结存(财务)", "EndBalance", typeof(string), (cv, obj) => { return FormatValue_GF("期末结存(财务)", cv, obj); }));
|
||
#endregion
|
||
break;
|
||
case "平仓明细":
|
||
#region 平仓导出列
|
||
dc.Add(new ExcelHelper.DataColumnModel("客户全称", "ClientFullName"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("簿记账户", "AssetBookName"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("订单", "TradeNumber"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("确认书编号", "ContractCode"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("结算书编号", "SettlementCode"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("状态", "StatusStr", (cv, obj) => { return FormatValue_GF("状态", cv, obj); }));
|
||
if (req.SummaryType == "远期/掉期")
|
||
{
|
||
dc.Add(new ExcelHelper.DataColumnModel("多空方向", "OptionType", (cv, obj) => { return FormatValue_GF("多空方向", cv, obj); }));
|
||
}
|
||
dc.Add(new ExcelHelper.DataColumnModel("客户名", "ClientShortName"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("成交日", "TradeDate", (cv, obj) => { return FormatValue_GF("成交日", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("成交手数", "OriginalLots", typeof(string), (cv, obj) => { return FormatValue_GF("成交手数", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("成交数量", "OriginalAmount", typeof(string), (cv, obj) => { return FormatValue_GF("成交数量", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("到期日", "ExerciseDate", (cv, obj) => { return FormatValue_GF("到期日", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("清算日期", "ClearDate", (cv, obj) => { return FormatValue_GF("清算日期", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("我方买/卖", "TradeDirection"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("名义本金", "StockEqvNotional", typeof(double), (cv, obj) => { return FormatValue_GF("名义本金", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("开仓费用", "TradePrice", typeof(double), (cv, obj) => { return FormatValue_GF("期初权利金收支", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("清算金额", "ClearPrice", typeof(double), (cv, obj) => { return FormatValue_GF("清算金额", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("我方期权清算盈亏", "ConfirmPnl", typeof(double), (cv, obj) => { return FormatValue_GF("我方期权清算盈亏", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("上期期末市值", "LastPv", typeof(double), (cv, obj) => { return FormatValue_GF("上期期末市值", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("上期期末累计浮动盈亏", "LastTotalPnl", typeof(double), (cv, obj) => { return FormatValue_GF("上期期末累计浮动盈亏", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("本期浮动盈亏", "GF_Pnl", typeof(double), (cv, obj) => { return FormatValue_GF("本期浮动盈亏", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("财务入账", "FinancialEntry", typeof(double)));
|
||
dc.Add(new ExcelHelper.DataColumnModel("可用资金(财务)", "AvailableCash", typeof(string), (cv, obj) => { return FormatValue_GF("可用资金(财务)", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("期末结存(财务)", "EndBalance", typeof(string), (cv, obj) => { return FormatValue_GF("期末结存(财务)", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("交易确认书", "TradeConfirmFileStatus", (cv, obj) => { return FormatValue_GF("交易确认书", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("结算确认书", "ClearConfirmFileStatus", (cv, obj) => { return FormatValue_GF("结算确认书", cv, obj); }));
|
||
#endregion
|
||
break;
|
||
default:
|
||
#region 默认导出列
|
||
dc.Add(new ExcelHelper.DataColumnModel("客户全称", "ClientFullName"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("簿记账户", "AssetBookName"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("订单", "TradeNumber"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("确认书编号", "ContractCode"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("结算书编号", "SettlementCode"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("状态", "StatusStr", (cv, obj) => { return FormatValue_GF("状态", cv, obj); }));
|
||
if (req.SummaryType == "远期/掉期")
|
||
{
|
||
dc.Add(new ExcelHelper.DataColumnModel("多空方向", "OptionType", (cv, obj) => { return FormatValue_GF("多空方向", cv, obj); }));
|
||
}
|
||
dc.Add(new ExcelHelper.DataColumnModel("客户名", "ClientShortName"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("成交日", "TradeDate", (cv, obj) => { return FormatValue_GF("成交日", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("成交手数", "OriginalLots", typeof(string), (cv, obj) => { return FormatValue_GF("成交手数", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("成交数量", "OriginalAmount", typeof(string), (cv, obj) => { return FormatValue_GF("成交数量", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("持仓数量", "PositionAmount", typeof(string), (cv, obj) => { return FormatValue_GF("持仓数量", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("到期日", "ExerciseDate", (cv, obj) => { return FormatValue_GF("到期日", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("清算日期", "ClearDate", (cv, obj) => { return FormatValue_GF("清算日期", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("我方买/卖", "TradeDirection"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("标的", "UnderlyingCode"));
|
||
dc.Add(new ExcelHelper.DataColumnModel("名义本金", "StockEqvNotional", typeof(double), (cv, obj) => { return FormatValue_GF("名义本金", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("开仓费用", "TradePrice", typeof(double), (cv, obj) => { return FormatValue_GF("期初权利金收支", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("清算金额", "ClearPrice", typeof(double), (cv, obj) => { return FormatValue_GF("清算金额", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("我方期权清算盈亏", "ConfirmPnl", typeof(double), (cv, obj) => { return FormatValue_GF("我方期权清算盈亏", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("上期期末市值", "LastPv", typeof(double), (cv, obj) => { return FormatValue_GF("上期期末市值", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("上期期末累计浮动盈亏", "LastTotalPnl", typeof(double), (cv, obj) => { return FormatValue_GF("上期期末累计浮动盈亏", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("本期期末市值", "Pv", typeof(double), (cv, obj) => { return FormatValue_GF("本期期末市值", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("本期期末累计浮动盈亏", "TotalPnl", typeof(double), (cv, obj) => { return FormatValue_GF("本期期末累计浮动盈亏", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("本期浮动盈亏", "GF_Pnl", typeof(double), (cv, obj) => { return FormatValue_GF("本期浮动盈亏", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("交易确认书", "TradeConfirmFileStatus", (cv, obj) => { return FormatValue_GF("交易确认书", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("结算确认书", "ClearConfirmFileStatus", (cv, obj) => { return FormatValue_GF("结算确认书", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("财务入账", "FinancialEntry", typeof(double)));
|
||
dc.Add(new ExcelHelper.DataColumnModel("可用资金(财务)", "AvailableCash", typeof(string), (cv, obj) => { return FormatValue_GF("可用资金(财务)", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("期末结存(财务)", "EndBalance", typeof(string), (cv, obj) => { return FormatValue_GF("期末结存(财务)", cv, obj); }));
|
||
if (req.SummaryType == "远期/掉期")
|
||
{
|
||
dc.Add(new ExcelHelper.DataColumnModel("交易确认日期", "TradeConfirmDate", (cv, obj) => { return FormatValue_GF("交易确认日期", cv, obj); }));
|
||
dc.Add(new ExcelHelper.DataColumnModel("了结确认日期", "ClearConfirmDate", (cv, obj) => { return FormatValue_GF("了结确认日期", cv, obj); }));
|
||
}
|
||
#endregion
|
||
break;
|
||
}
|
||
}
|
||
|
||
|
||
var req1 = new ListToExcelRequest<FinancialSummaryOptionModel>
|
||
{
|
||
Columns = dc,
|
||
ColumnAutoSize = false,
|
||
DataGroups = null,
|
||
Datas = list,
|
||
IsColumnWritten = true,
|
||
GetRowStyle = dataIndex => rowStyleDic.TryGetValue(dataIndex, out var style) ? style : null,
|
||
SheetName = "Sheet1"
|
||
};
|
||
|
||
var result = new ExcelHelper().ListToExcel(req1);
|
||
buffer = result.Buffer;
|
||
//new ExcelHelper().ListToExcel(dc.ToArray(), list, "Sheet1", true, out buffer);
|
||
return File(result.Buffer, xlsxMimeType);
|
||
}
|
||
#endregion
|
||
|
||
|
||
|
||
/// <summary>
|
||
/// 中粮场外期权账单
|
||
/// </summary>
|
||
/// <param name="req"></param>
|
||
/// <returns></returns>
|
||
public ActionResult DownloadFinancialSummary_ZL(FinancialSummaryModelReq req)
|
||
{
|
||
if (req.CurrentPeriodDateStart == default || req.CurrentPeriodDateEnd == default)
|
||
{
|
||
return ShowError("本期区间值不应为空");
|
||
}
|
||
if (req.CurrentPeriodDateStart > req.CurrentPeriodDateEnd)
|
||
{
|
||
return ShowError("区间开始日期应小于区间结束日期");
|
||
}
|
||
var model = new FinancialSummaryReportZLService(CurUser).GetReportData(req);
|
||
var modelDict = new Dictionary<string, object>();
|
||
modelDict.Add("Sheet1", model);
|
||
var sourcePath = OtcAppContext.MapPath("~/App_Docs/导出模板");
|
||
var settleDocName = "中粮-场外期权账单.xlsx";
|
||
var sourceFileName = Path.Combine(sourcePath, settleDocName);
|
||
var buffer = new ExcelTemplateGenerator().SetTemplateFile(sourceFileName).SetTemplateData(modelDict).Output();
|
||
return File(buffer, "application/ms-excel", $"场外期权账单-{req.CurrentPeriodDateEnd:yyyy-MM-dd}.xlsx");
|
||
}
|
||
|
||
public dynamic FormatValue_GF(string columnName, dynamic currentValue, object obj)
|
||
{
|
||
string result = currentValue?.ToString();
|
||
switch (columnName)
|
||
{
|
||
case "多空方向":
|
||
result = currentValue == "无状态" ? "" : (currentValue == "看涨" ? "多头" : "空头");
|
||
break;
|
||
case "看涨看跌":
|
||
result = currentValue == "无状态" ? "" : currentValue;
|
||
break;
|
||
case "状态":
|
||
if (currentValue != null && currentValue is bool)
|
||
{
|
||
result = (currentValue ? "完结" : "未完结");
|
||
}
|
||
if (currentValue != null && currentValue is string)
|
||
{
|
||
result = currentValue == "无状态" ? "" : currentValue;
|
||
}
|
||
break;
|
||
case "名义本金(万元)":
|
||
result = "0";
|
||
if (currentValue != null && currentValue is double)
|
||
{
|
||
result = ((double)currentValue / 10000).OtcFormat(OtcFormatFlag.StockEqvNotional);
|
||
}
|
||
break;
|
||
case "名义本金":
|
||
if (currentValue == 0)
|
||
{
|
||
result = null;
|
||
}
|
||
else
|
||
{
|
||
if (currentValue != null && currentValue is double)
|
||
{
|
||
result = (double.IsNaN(currentValue) ? 0 : (double)currentValue).OtcFormat(OtcFormatFlag.StockEqvNotional);
|
||
}
|
||
}
|
||
break;
|
||
case "交易确认书":
|
||
case "结算确认书":
|
||
result = currentValue == "草稿" ? "未用印" : currentValue;
|
||
break;
|
||
case "成交日":
|
||
case "到期日":
|
||
case "清算日期":
|
||
case "交易确认日期":
|
||
case "了结确认日期":
|
||
if (currentValue != null && currentValue is DateTime)
|
||
{ result = currentValue == default(DateTime) ? null : currentValue.ToString("yyyy-MM-dd"); }
|
||
break;
|
||
case "成交手数":
|
||
if (currentValue == 0)
|
||
{
|
||
result = null;
|
||
}
|
||
else
|
||
{
|
||
if (currentValue != null && currentValue is double)
|
||
{
|
||
result = (double.IsNaN(currentValue) ? 0d : (double)currentValue).OtcFormatNotional();
|
||
}
|
||
}
|
||
break;
|
||
case "成交数量":
|
||
case "持仓数量":
|
||
if (currentValue == 0)
|
||
{
|
||
result = null;
|
||
}
|
||
else
|
||
{
|
||
if (currentValue != null && currentValue is double)
|
||
{
|
||
var amount = (double.IsNaN(currentValue) ? 0d : (double)currentValue);
|
||
var trade = obj as FinancialSummaryOptionModel;
|
||
result = (PS.Config.IsUseDisplayNotional ? amount * trade.CountRatio : amount).OtcFormatNotional();
|
||
}
|
||
}
|
||
break;
|
||
case "期初权利金收支":
|
||
case "清算金额(我方收入)":
|
||
case "清算金额":
|
||
case "期货盈亏(结算价)":
|
||
case "手续费":
|
||
case "清算金额(我方支出)":
|
||
if (currentValue != null && currentValue is double)
|
||
{
|
||
result = (double.IsNaN(currentValue) ? 0 : (double)currentValue).OtcFormatMoney(grouping: false);
|
||
}
|
||
break;
|
||
case "我方期权清算盈亏":
|
||
case "上期期末市值":
|
||
case "上期期末累计浮动盈亏":
|
||
case "本期期末市值":
|
||
case "本期期末累计浮动盈亏":
|
||
case "本期浮动盈亏":
|
||
case "费后总盈亏":
|
||
if (currentValue != null && currentValue is double)
|
||
{ result = (double.IsNaN(currentValue) ? 0 : (double)currentValue).OtcFormatMoney(grouping: false); }
|
||
break;
|
||
case "可用资金(财务)":
|
||
case "期末结存(财务)":
|
||
if (currentValue == 0)
|
||
{
|
||
result = null;
|
||
}
|
||
else
|
||
{
|
||
if (currentValue != null && currentValue is double)
|
||
{ result = (double.IsNaN(currentValue) ? 0 : (double)currentValue).OtcFormatMoney(grouping: false); }
|
||
}
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
|
||
return result;
|
||
}
|
||
|
||
public dynamic FormatValue(string columnName, dynamic currentValue, object obj)
|
||
{
|
||
string result = currentValue?.ToString();
|
||
switch (columnName)
|
||
{
|
||
case "多空方向":
|
||
result = currentValue == "看涨" ? "多头" : "空头";
|
||
break;
|
||
case "状态":
|
||
if (currentValue is bool)
|
||
{ result = currentValue ? "完结" : "未完结"; }
|
||
break;
|
||
case "名义本金(万元)":
|
||
result = "0";
|
||
if (currentValue != null && currentValue is double)
|
||
{
|
||
result = (currentValue / 10000).OtcFormat(OtcFormatFlag.StockEqvNotional);
|
||
}
|
||
break;
|
||
case "名义本金":
|
||
if (currentValue != null && currentValue is double)
|
||
{
|
||
result = (double.IsNaN(currentValue) ? 0 : currentValue).OtcFormat(OtcFormatFlag.StockEqvNotional);
|
||
}
|
||
break;
|
||
case "交易确认书":
|
||
case "结算确认书":
|
||
result = currentValue == "草稿" ? "未用印" : currentValue;
|
||
break;
|
||
case "成交日":
|
||
case "到期日":
|
||
case "清算日期":
|
||
case "交易确认日期":
|
||
case "了结确认日期":
|
||
if (currentValue != null && currentValue is DateTime)
|
||
{ result = currentValue == default(DateTime) ? null : currentValue.ToString("yyyy-MM-dd"); }
|
||
break;
|
||
case "成交手数":
|
||
if (currentValue != null && currentValue is double)
|
||
{
|
||
result = (double.IsNaN(currentValue) ? 0d : currentValue).OtcFormatNotional();
|
||
}
|
||
break;
|
||
case "成交数量":
|
||
case "持仓数量":
|
||
if (currentValue != null && currentValue is double)
|
||
{
|
||
var amount = (double.IsNaN(currentValue) ? 0d : currentValue);
|
||
var trade = obj as FinancialSummaryOptionModel;
|
||
result = (PS.Config.IsUseDisplayNotional ? amount * trade.CountRatio : amount).OtcFormatNotional();
|
||
}
|
||
break;
|
||
case "期初权利金收支":
|
||
case "清算金额(我方收入)":
|
||
case "清算金额":
|
||
case "期货盈亏(结算价)":
|
||
case "手续费":
|
||
case "清算金额(我方支出)":
|
||
if (currentValue != null && currentValue is double)
|
||
{
|
||
result = (double.IsNaN(currentValue) ? 0 : currentValue).OtcFormatMoney(grouping: false);
|
||
}
|
||
break;
|
||
case "我方期权清算盈亏":
|
||
case "上期期末市值":
|
||
case "上期期末累计浮动盈亏":
|
||
case "本期期末市值":
|
||
case "本期期末累计浮动盈亏":
|
||
case "本期浮动盈亏":
|
||
case "费后总盈亏":
|
||
if (currentValue != null && currentValue is double)
|
||
{ result = (double.IsNaN(currentValue) ? 0 : currentValue).OtcFormatMoney(grouping: false); }
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
|
||
return result;
|
||
}
|
||
|
||
public object FinancialDetail(FinancialSummaryModelReq req, string type)
|
||
{
|
||
ViewBag.Req = req;
|
||
ViewBag.Title = type;
|
||
switch (type)
|
||
{
|
||
case "开仓明细":
|
||
req.TradeConfirmDateStart = req.CurrentPeriodDateStart;
|
||
req.TradeConfirmDateEnd = req.CurrentPeriodDateEnd;
|
||
break;
|
||
case "持仓明细":
|
||
req.ClearConfirmDateStart = req.CurrentPeriodDateEnd.AddDays(1);
|
||
break;
|
||
case "平仓明细":
|
||
req.ClearConfirmDateStart = req.CurrentPeriodDateStart;
|
||
req.ClearConfirmDateEnd = req.CurrentPeriodDateEnd;
|
||
break;
|
||
default:
|
||
return JsonError();
|
||
}
|
||
return View();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 广发定制 开仓明细、持仓明细、平仓明细 详情页面
|
||
/// </summary>
|
||
/// <param name="req"></param>
|
||
/// <param name="type"></param>
|
||
/// <returns></returns>
|
||
public object FinancialDetail_GF(FinancialSummaryModelReq req, string type)
|
||
{
|
||
ViewBag.Req = req;
|
||
ViewBag.Title = type;
|
||
switch (type)
|
||
{
|
||
case "开仓明细":
|
||
req.TradeConfirmDateStart = req.CurrentPeriodDateStart;
|
||
req.TradeConfirmDateEnd = req.CurrentPeriodDateEnd;
|
||
break;
|
||
case "持仓明细":
|
||
req.ClearConfirmDateStart = req.CurrentPeriodDateEnd.AddDays(1);
|
||
break;
|
||
case "平仓明细":
|
||
req.ClearConfirmDateStart = req.CurrentPeriodDateStart;
|
||
req.ClearConfirmDateEnd = req.CurrentPeriodDateEnd;
|
||
break;
|
||
default:
|
||
return JsonError();
|
||
}
|
||
return View();
|
||
}
|
||
|
||
[HttpPost]
|
||
public JsonResult tradeInnerListQuery(TradeReq req)
|
||
{
|
||
req.UserAssets = CurUser.GetAssetUnitIds();
|
||
req.UserClients = CurUser.GetClientIdsByCurUser(CurUser.交易管理_查看所有交易);
|
||
var sList = new TradeQueryService(CurUser).SearchList(req);
|
||
return Json(sList);
|
||
}
|
||
|
||
public ActionResult tradeInner()
|
||
{
|
||
return View();
|
||
}
|
||
|
||
[MyAuthorize("结算管理-提前终止报告")]
|
||
public ActionResult tradeDayConfirmList()
|
||
{
|
||
if (GlobalConfig.SelectConfirmationBookTemplate)
|
||
{
|
||
try
|
||
{
|
||
if (string.IsNullOrWhiteSpace(GlobalConfig.PluginFolder))
|
||
{ throw new Exception("未找到插件路径"); }
|
||
var dirPath = Path.Combine(GlobalConfig.PluginFolder, "App_Docs", ContractTypeEnum.Clearing);
|
||
if (!Directory.Exists(dirPath))
|
||
{
|
||
Directory.CreateDirectory(dirPath);
|
||
}
|
||
var paths = Directory.GetFiles(dirPath, "*.docx");
|
||
for (var i = 0; i < paths.Length; i++)
|
||
{
|
||
paths[i] = Path.GetFileName(paths[i]);
|
||
}
|
||
ViewBag.TemplateNames = paths;
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
LogFactory.GetLogger("SelectConfirmationBookTemplate").Error(ex);
|
||
}
|
||
}
|
||
return View();
|
||
}
|
||
|
||
public ActionResult tradeEndConfirmList()
|
||
{
|
||
if (GlobalConfig.SelectConfirmationBookTemplate)
|
||
{
|
||
try
|
||
{
|
||
if (string.IsNullOrWhiteSpace(GlobalConfig.PluginFolder))
|
||
{ throw new Exception("未找到插件路径"); }
|
||
var dirPath = Path.Combine(GlobalConfig.PluginFolder, "App_Docs", ContractTypeEnum.Clearing);
|
||
if (!Directory.Exists(dirPath))
|
||
{
|
||
Directory.CreateDirectory(dirPath);
|
||
}
|
||
var paths = Directory.GetFiles(dirPath, "*.docx");
|
||
for (var i = 0; i < paths.Length; i++)
|
||
{
|
||
paths[i] = Path.GetFileName(paths[i]);
|
||
}
|
||
ViewBag.TemplateNames = paths;
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
LogFactory.GetLogger("SelectConfirmationBookTemplate").Error(ex);
|
||
}
|
||
}
|
||
return View();
|
||
}
|
||
|
||
[MyAuthorize("交易管理-交易搜索")]
|
||
public ActionResult tradeConfirmList(string volType = "交易", int tabIndex = (int)TradeTabIndexEnum.今日成交)
|
||
{
|
||
ViewBag.VolType = volType;
|
||
ViewBag.TabIndex = tabIndex;
|
||
return View();
|
||
}
|
||
|
||
[MyAuthorize("交易管理-交易搜索")]
|
||
public ActionResult tradePreEndList(string volType = "交易")
|
||
{
|
||
ViewBag.VolType = volType;
|
||
return View();
|
||
}
|
||
|
||
[MyAuthorize("交易管理-交易搜索")]
|
||
public ActionResult tradeKnockedOutList()
|
||
{
|
||
return View();
|
||
}
|
||
|
||
public ActionResult tradeFileManagement()
|
||
{
|
||
var contractBLL = new TradeContractBLL(CurUser);
|
||
var tradeNumber = Request.Query["tradeNumber"].ToString();
|
||
var trade = db.trade.FirstOrDefault(x => x.TradeNumber == tradeNumber);
|
||
|
||
//交易确认书
|
||
var confirmDoc = contractBLL.GetContractDoc(trade?.id ?? 0, ContractTypeEnum.Trade);
|
||
if (confirmDoc != null)
|
||
{
|
||
if (System.IO.File.Exists(confirmDoc.AbsolutePath))
|
||
{
|
||
ViewBag.ConfirmBook = confirmDoc.RelativePath;
|
||
}
|
||
}
|
||
|
||
#region 提前终止确认书
|
||
|
||
var preconfirmDoc = contractBLL.GetContractDoc(trade?.id ?? 0, ContractTypeEnum.UnWind);
|
||
if (preconfirmDoc != null)
|
||
{
|
||
if (System.IO.File.Exists(preconfirmDoc.AbsolutePath))
|
||
{
|
||
ViewBag.PreAbortConfirmBook = preconfirmDoc.RelativePath;
|
||
}
|
||
}
|
||
|
||
#endregion
|
||
|
||
#region 结算确认书
|
||
|
||
var clearingDoc = contractBLL.GetContractDoc(trade?.id ?? 0, ContractTypeEnum.Clearing);
|
||
if (clearingDoc != null)
|
||
{
|
||
if (System.IO.File.Exists(clearingDoc.AbsolutePath))
|
||
{
|
||
ViewBag.ClearingDoc = clearingDoc.RelativePath;
|
||
}
|
||
}
|
||
|
||
#endregion
|
||
|
||
return View();
|
||
}
|
||
|
||
public ActionResult tradeContractManagement()
|
||
{
|
||
return View();
|
||
}
|
||
|
||
public ActionResult UploadContractFile(string encryptId, string fileDescription, string ContractCode, bool OurpartySeal = false, bool CounterpartySeal = false)
|
||
{
|
||
var uploadFileModel = Request.Form.Files.Count > 0 ? Request.Form.Files[0].ToUploadFileModel() : null;
|
||
var (flag, msg, optDate, stampPath) = new ConfirmationGenerateService(CurUser).UploadContractFile(encryptId, fileDescription, ContractCode, OurpartySeal, CounterpartySeal, uploadFileModel);
|
||
|
||
if (flag)
|
||
{
|
||
return JsonSuccess(msg);
|
||
}
|
||
return JsonError(msg);
|
||
}
|
||
public ActionResult UploadContractFileNew(int tradeId, bool isCounterpartyDoc = false, bool useContractCode = false, string contractCode = null)
|
||
{
|
||
var uploadFileModel = Request.Form.Files.Count > 0 ? Request.Form.Files[0].ToUploadFileModel() : null;
|
||
|
||
var result = new ConfirmationGenerateService(CurUser).UploadContractFileNew(tradeId, useContractCode, contractCode, isCounterpartyDoc, uploadFileModel);
|
||
if (result.Success)
|
||
{
|
||
return JsonSuccess(result.Message);
|
||
}
|
||
return JsonError(result.Message);
|
||
}
|
||
|
||
public ActionResult tradeContractManagementQuery(string tradeNumber)
|
||
{
|
||
if (string.IsNullOrWhiteSpace(tradeNumber))
|
||
{
|
||
return JsonError("该交易TradeNumber无效");
|
||
}
|
||
var trade = db.trade.FirstOrDefault(t => t.TradeNumber == tradeNumber);
|
||
if (trade == null)
|
||
{
|
||
return JsonError("该交易TradeNumber无效");
|
||
}
|
||
|
||
var contractBLL = new TradeContractBLL(CurUser);
|
||
var contractDocs = contractBLL.GetAllContractDocs(trade.id);
|
||
|
||
var resultList = new List<ITradeContractDocument>();
|
||
if (contractDocs != null && contractDocs.Any())
|
||
{
|
||
resultList.AddRange(contractDocs);
|
||
}
|
||
|
||
var tradeFileList = db.trade_file.Where(f => f.TradeId == trade.id).ToList();
|
||
if (tradeFileList != null && tradeFileList.Count > 0)
|
||
{
|
||
tradeFileList.ForEach(d =>
|
||
{
|
||
resultList.Add(new TradeOtherDocument
|
||
{
|
||
id = d.id,
|
||
EncryptId = d.EncryptId,
|
||
FileName = d.FileName,
|
||
Type = "其他",
|
||
RelativePath = d.FileName,
|
||
StampDocumentFileName = "",
|
||
Status = "",
|
||
Comments = d.Description
|
||
});
|
||
});
|
||
}
|
||
|
||
var result = new SearchListResult<ITradeContractDocument>
|
||
{
|
||
page = 1,
|
||
records = resultList.Count(),
|
||
rows = resultList,
|
||
total = 1
|
||
};
|
||
|
||
return Json(result);
|
||
}
|
||
|
||
public ActionResult tradeOperationHistory(string encryptId, bool IsExchange = false)
|
||
{
|
||
var tradeId = DataProtectHelper.DecryptInt(encryptId);
|
||
var datas =
|
||
db.TradeAuditLog.Where(n => n.TradeId == tradeId && (n.AuditFlag & TradeAuditFlag.operation) > 0)
|
||
.Select(n => new TradeAuditLogDto
|
||
{
|
||
id = n.id,
|
||
OptType = n.OptType,
|
||
Changes = n.Changes,
|
||
OptName = n.OptName,
|
||
OptDate = n.OptDate
|
||
}).ToArray();
|
||
datas = datas.OrderByDescending(n => n.id).ToArray();
|
||
foreach (var item in datas)
|
||
{
|
||
if (IsExchange && item.OptType == "批量调整-标的交易")
|
||
{
|
||
item.Changes = new DatatraceQueryService(CurUser).ReplaceDataChanges(new trade(), item.Changes);
|
||
}
|
||
else if (!IsExchange && item.OptType == "修改交易")
|
||
{
|
||
item.Changes = new DatatraceQueryService(CurUser).ReplaceDataChanges(new trade(), item.Changes);
|
||
}
|
||
if (!string.IsNullOrEmpty(item.Changes))
|
||
{
|
||
//因为一开始用英文存入的是自定义字段 所以无法转对应的名称,特加此段逻辑进行转换
|
||
item.Changes = item.Changes.Replace("ExchangeRate", "汇率");
|
||
}
|
||
}
|
||
|
||
return View(datas);
|
||
}
|
||
|
||
[MyAuthorize("结算管理-障碍期权报告")]
|
||
public ActionResult BarrierReportList()
|
||
{
|
||
return View();
|
||
}
|
||
public ActionResult GetTradeFiles(string tradeNumber)
|
||
{
|
||
|
||
//根据TradeNumber,到服务器指定TradeNumber下的文件夹遍历文件
|
||
//var path = Server.MapPath($"~/App_Docs/TradeFile/{tradeNumber}");
|
||
//if (!Directory.Exists(path))
|
||
//{
|
||
// return Json(new List<object>());
|
||
//}
|
||
|
||
//string[] filePath = Directory.GetFiles(path);
|
||
|
||
//var list = new List<object>();
|
||
//foreach (var namePath in filePath)
|
||
//{
|
||
// list.Add(new { FileName = Path.GetFileName(namePath) });
|
||
//}
|
||
|
||
//if (list.Count <= 0)
|
||
//{
|
||
// return Json(new List<object>());
|
||
//}
|
||
if (string.IsNullOrWhiteSpace(tradeNumber))
|
||
{
|
||
return JsonError("该交易TradeNumber无效");
|
||
}
|
||
var trade = db.trade.FirstOrDefault(t => t.TradeNumber == tradeNumber);
|
||
if (trade == null)
|
||
{
|
||
return JsonError("该交易TradeNumber无效");
|
||
}
|
||
var tradeFileList = db.trade_file.Where(f => f.TradeId == trade.id).ToList();
|
||
|
||
return Json(tradeFileList);
|
||
}
|
||
|
||
public ActionResult UploadTradeFiles(string tradeNumber, string fileDescription)
|
||
{
|
||
try
|
||
{
|
||
if (string.IsNullOrWhiteSpace(tradeNumber))
|
||
{
|
||
return JsonError("该交易TradeNumber无效");
|
||
}
|
||
if (string.IsNullOrWhiteSpace(fileDescription))
|
||
{
|
||
fileDescription = "人工添加";
|
||
}
|
||
//if (string.IsNullOrWhiteSpace(fileDescription))
|
||
//{
|
||
// return JsonError("请填写文件描述");
|
||
//}
|
||
|
||
var trade = db.trade.FirstOrDefault(t => t.TradeNumber == tradeNumber);
|
||
if (trade == null)
|
||
{
|
||
return JsonError("该交易TradeNumber无效");
|
||
}
|
||
|
||
var tradeFiles = db.trade_file.Where(f => f.TradeId == trade.id).ToList();
|
||
|
||
var dirPath = Server.MapPath($"~/App_Docs/TradeFile/{tradeNumber}");
|
||
if (!Directory.Exists(dirPath))
|
||
{
|
||
Directory.CreateDirectory(dirPath);
|
||
}
|
||
|
||
var newFileList = new List<trade_file>();
|
||
foreach (IFormFile file in Request.Form.Files)
|
||
{
|
||
if (PS.Config.ErpElement.SecuritiesEnvironment &&
|
||
(file.FileName.ToLower().EndsWith("合规意见书.pdf") ||
|
||
file.FileName.ToLower().EndsWith("履约保证书.pdf")) &&
|
||
file.Length > Modules.SuperviseReportModule.SAC.Model.ReportStatusModel.MaxAnnexLength)
|
||
{
|
||
return JsonError("上传文件出错,合规意见书/履约保证书文件大小不应超过30MB");
|
||
}
|
||
var tempName = file.FileName;
|
||
if (PS.Config.ErpElement.SecuritiesEnvironment)
|
||
{
|
||
tempName = $"{tradeNumber}-{file.FileName}";
|
||
}
|
||
var filePath = Path.Combine(dirPath, tempName);
|
||
if (System.IO.File.Exists(filePath))
|
||
{
|
||
System.IO.File.Delete(filePath);
|
||
var tempFile = tradeFiles.FirstOrDefault(f => f.Path == filePath);
|
||
if (tempFile != null)
|
||
{
|
||
db.trade_file.Remove(tempFile);
|
||
}
|
||
}
|
||
using var stream = file.OpenReadStream();
|
||
using var fstream = System.IO.File.OpenWrite(filePath);
|
||
stream.CopyTo(fstream);
|
||
newFileList.Add(new trade_file
|
||
{
|
||
TradeId = trade.id,
|
||
Path = filePath,
|
||
Description = fileDescription,
|
||
OptId = CurUser.UserId,
|
||
OptName = CurUser.UserName,
|
||
OptDate = DateTime.Now
|
||
});
|
||
}
|
||
|
||
if (newFileList.Count > 0)
|
||
{
|
||
db.trade_file.AddRange(newFileList);
|
||
}
|
||
|
||
db.SaveChanges();
|
||
|
||
return JsonSuccess("上传成功");
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
LogFactory.GetLogger("UploadTradeFiles").Error(ex);
|
||
return JsonError("上传文件出错");
|
||
}
|
||
}
|
||
|
||
public ActionResult DownLoadTradeFiles(string tradeNumber, string[] fileName)
|
||
{
|
||
if (string.IsNullOrWhiteSpace(tradeNumber))
|
||
{
|
||
return JsonError("该交易TradeNumber无效");
|
||
}
|
||
|
||
var trade = db.trade.FirstOrDefault(t => t.TradeNumber == tradeNumber);
|
||
if (trade == null)
|
||
{
|
||
return JsonError("该交易TradeNumber无效");
|
||
}
|
||
|
||
var filePath = Server.MapPath($"~/App_Docs/TradeFile/{tradeNumber}");
|
||
if (!Directory.Exists(filePath))
|
||
{
|
||
return JsonError("该交易TradeNumber无效");
|
||
}
|
||
|
||
if (fileName.Length <= 0)
|
||
{
|
||
return JsonError("服务器不存在该文件");
|
||
}
|
||
|
||
var list = new List<string>();
|
||
foreach (var name in fileName)
|
||
{
|
||
list.Add($"/App_Docs/TradeFile/{tradeNumber}/{name}");
|
||
}
|
||
|
||
if (list.Count < 0)
|
||
{
|
||
return JsonError("服务器不存在该文件");
|
||
}
|
||
|
||
return Json(list);
|
||
}
|
||
|
||
|
||
public ActionResult DownTradeFiles(string tradeNumber)
|
||
{
|
||
var filePath = Server.MapPath($"~/App_Docs");
|
||
if (!Directory.Exists(filePath))
|
||
{
|
||
return JsonError("该交易没有上传过交易确认书文件");
|
||
}
|
||
|
||
var fileName = "*交易确认书*_" + tradeNumber + ".docx";
|
||
var files = Directory.GetFiles(filePath, fileName);
|
||
var list = files.ToList();
|
||
if (list.Count < 0)
|
||
{
|
||
return JsonError("该交易没有上传过交易确认书文件");
|
||
}
|
||
|
||
var listName = new List<string>();
|
||
foreach (var name in list)
|
||
{
|
||
var urlPath = RelativePath(filePath, name);
|
||
listName.Add($"/App_Docs/{urlPath}");
|
||
}
|
||
return Json(listName);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 绝对路径转相对路径
|
||
/// </summary>
|
||
/// <param name="absolutePath"></param>
|
||
/// <param name="relativeTo"></param>
|
||
/// <returns></returns>
|
||
public string RelativePath(string absolutePath, string relativeTo)
|
||
{
|
||
var absoluteDirectories = absolutePath.Split('\\');
|
||
var relativeDirectories = relativeTo.Split('\\');
|
||
|
||
//Get the shortest of the two paths
|
||
var length = absoluteDirectories.Length < relativeDirectories.Length ? absoluteDirectories.Length : relativeDirectories.Length;
|
||
|
||
//Use to determine where in the loop we exited
|
||
var lastCommonRoot = -1;
|
||
int index;
|
||
|
||
//Find common root
|
||
for (index = 0; index < length; index++)
|
||
{
|
||
if (absoluteDirectories[index] == relativeDirectories[index])
|
||
{
|
||
lastCommonRoot = index;
|
||
}
|
||
else
|
||
{
|
||
break;
|
||
}
|
||
}
|
||
|
||
//If we didn't find a common prefix then throw
|
||
if (lastCommonRoot == -1)
|
||
{
|
||
throw new ArgumentException("Paths do not have a common base");
|
||
}
|
||
|
||
//Build up the relative path
|
||
var relativePath = new StringBuilder();
|
||
|
||
//Add on the ..
|
||
for (index = lastCommonRoot + 1; index < absoluteDirectories.Length; index++)
|
||
{
|
||
if (absoluteDirectories[index].Length > 0)
|
||
{
|
||
relativePath.Append("..\\");
|
||
}
|
||
}
|
||
|
||
//Add on the folders
|
||
for (index = lastCommonRoot + 1; index < relativeDirectories.Length - 1; index++)
|
||
{
|
||
relativePath.Append(relativeDirectories[index] + "\\");
|
||
}
|
||
|
||
relativePath.Append(relativeDirectories[relativeDirectories.Length - 1]);
|
||
|
||
return relativePath.ToString();
|
||
}
|
||
|
||
public ActionResult DeleteTradeFiles(string tradeNumber, string[] fileName)
|
||
{
|
||
try
|
||
{
|
||
if (string.IsNullOrWhiteSpace(tradeNumber))
|
||
{
|
||
return JsonError("该交易TradeNumber无效");
|
||
}
|
||
|
||
var trade = db.trade.FirstOrDefault(t => t.TradeNumber == tradeNumber);
|
||
if (trade == null)
|
||
{
|
||
return JsonError("该交易TradeNumber无效");
|
||
}
|
||
|
||
var filePath = Server.MapPath($"~/App_Docs/TradeFile/{tradeNumber}");
|
||
if (!Directory.Exists(filePath))
|
||
{
|
||
return JsonError("该交易TradeNumber无效");
|
||
}
|
||
|
||
if (fileName.Length <= 0)
|
||
{
|
||
return JsonError("服务器不存在该文件");
|
||
}
|
||
|
||
foreach (var name in fileName)
|
||
{
|
||
var path = Path.Combine(filePath, name);
|
||
if (System.IO.File.Exists(path))
|
||
{
|
||
System.IO.File.Delete(path);
|
||
}
|
||
var tradeFiles = db.trade_file.Where(f => f.TradeId == trade.id).ToList();
|
||
var tempFile = tradeFiles.FirstOrDefault(f => f.Path == path);
|
||
if (tempFile != null)
|
||
{
|
||
db.trade_file.Remove(tempFile);
|
||
}
|
||
}
|
||
|
||
db.SaveChanges();
|
||
|
||
return JsonSuccess("删除成功");
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
|
||
LogFactory.GetLogger("DeleteTradeFiles").Error("删除文件", ex);
|
||
return JsonError("删除失败");
|
||
}
|
||
}
|
||
public JsonResult traderevoke(string tradeids, int actionType)
|
||
{
|
||
var tradeidArr = DataConvert.ConvertCommaValuesToInt32Array(tradeids);
|
||
new TradeRevokeService(CurUser).TradeRevoke(tradeidArr, actionType);
|
||
return JsonSuccess("交易撤销成功");
|
||
}
|
||
|
||
public JsonResult tradewithdraw(string tradeids)
|
||
{
|
||
var tradeidArr = DataConvert.ConvertCommaValuesToInt32Array(tradeids);
|
||
new TradeRevokeService(CurUser).TradeWithdraw(tradeidArr);
|
||
return JsonSuccess("交易撤销成功");
|
||
}
|
||
|
||
|
||
// trialDataId: 二次确认时回传的 quotaTrial.id,用于超时校验;首次确认不传,为 null 时不做超时判断
|
||
public JsonResult tradeConfirm(string tradeids, string additionalProcessing, string ignoreRiskRuleIds, int? trialDataId, bool isSkipCheck = false)
|
||
{
|
||
var tradeidArr = DataConvert.ConvertCommaValuesToInt32Array(tradeids);
|
||
if (tradeids is null || !tradeids.Any(n => n > 0))
|
||
{
|
||
return JsonError("请至少选择一项要生成确认书的交易,参数tradeids:" + tradeids);
|
||
}
|
||
var config = valuedateBLL.SystemDate;
|
||
var riskWarningConfirmExpireSeconds = 300;
|
||
var riskWarningConfirmExpireSecondsConfig = AppManager.GetAppConfigValue("ProjectConfig", "Trade.RiskWarningConfirmExpireSeconds");
|
||
if (!string.IsNullOrWhiteSpace(riskWarningConfirmExpireSecondsConfig)
|
||
&& int.TryParse(riskWarningConfirmExpireSecondsConfig, out var configuredRiskWarningConfirmExpireSeconds)
|
||
&& configuredRiskWarningConfirmExpireSeconds > 0)
|
||
{
|
||
riskWarningConfirmExpireSeconds = configuredRiskWarningConfirmExpireSeconds;
|
||
}
|
||
// 组合特批由单独类型明确表达,避免只有老风控异常时误放行新风控。
|
||
var isOldNewRiskConfirm = additionalProcessing == tradeBLL.OldNewRiskConfirm;
|
||
var ignoreMoneyCheck = tradeidArr.Count() == 1 && (additionalProcessing == tradeBLL.LackOfMoney || isOldNewRiskConfirm);
|
||
var ignoreRiskWarning = tradeidArr.Count() == 1 && (additionalProcessing == tradeBLL.RiskWarningConfirm || isOldNewRiskConfirm);
|
||
var ignoreRiskRuleIdArr = StringHelper.ConvertCommaValuesToStringArray(ignoreRiskRuleIds);
|
||
_logger.Info($"TradeConfirmRisk.Request tradeids:{tradeids}, additionalProcessing:{additionalProcessing}, trialDataId:{trialDataId}, ignoreMoneyCheck:{ignoreMoneyCheck}, ignoreRiskWarning:{ignoreRiskWarning}, ignoreRiskRuleIds:{ignoreRiskRuleIds}, isSkipCheck:{isSkipCheck}, userId:{CurUser?.UserId}");
|
||
// 老风控交易特批、新风控审批及组合特批统一基于 trialDataId 做超时校验,超时后清空放行标记并重新校验。
|
||
// tradeview.js 和 swapTradeView.js 会回传 trialDataId;未回传的旧入口保持原有行为,不进入超时校验。
|
||
if (ignoreMoneyCheck || ignoreRiskWarning)
|
||
{
|
||
var trialExpired = false;
|
||
if (trialDataId.HasValue)
|
||
{
|
||
// swapTradeView.js:按 quotaTrial.OptDate 校验,查不到记录也视为过期
|
||
trialExpired = new QuotaMonitorService(CurUser).IsQuotaTrialExpired(trialDataId.Value, riskWarningConfirmExpireSeconds);
|
||
}
|
||
if (trialExpired)
|
||
{
|
||
_logger.Info($"TradeConfirmRisk.TrialExpired tradeids:{tradeids}, additionalProcessing:{additionalProcessing}, trialDataId:{trialDataId}, expireSeconds:{riskWarningConfirmExpireSeconds}, userId:{CurUser?.UserId}");
|
||
ignoreMoneyCheck = false;
|
||
ignoreRiskWarning = false;
|
||
ignoreRiskRuleIdArr = Array.Empty<string>();
|
||
}
|
||
}
|
||
var isSkipApproval = false;
|
||
if (CurUser.交易管理_特批批量确认 && isSkipCheck)
|
||
{
|
||
ignoreMoneyCheck = true;
|
||
isSkipApproval = true;
|
||
}
|
||
var result = new TradeConfirmService(CurUser).tradeConfirm(tradeidArr, ignoreMoneyCheck, isSkipApproval, ignoreRiskWarning, ignoreRiskRuleIdArr);
|
||
_logger.Info($"TradeConfirmRisk.Result tradeids:{tradeids}, lackOfMoney:{result.LackOfMoney}, type:{result.type}, trialDataId:{result.TrialDataId}, oldRiskNeedSpecialApproval:{result.OldRiskNeedSpecialApproval}, newRiskNeedApproval:{result.NewRiskNeedApproval}, newRiskBlocked:{result.NewRiskBlocked}, ignoreRiskRuleIds:{string.Join(",", result.ignoreRiskRuleIds ?? new List<string>())}, errorMsgLength:{result.errorMsg?.Length ?? 0}, tipMsgLength:{result.tipMsg?.Length ?? 0}, userId:{CurUser?.UserId}");
|
||
|
||
//如果需要前端确认信息,触发新老风控
|
||
if (result.LackOfMoney)
|
||
{
|
||
// 新风控禁止优先级最高,即使老风控允许特批也只展示详情,不提供特批入口。
|
||
if (result.NewRiskBlocked)
|
||
{
|
||
_logger.Info($"TradeConfirmRisk.Response tradeids:{tradeids}, proccessType:QuotaTrialError, source:NewRiskBlocked, typecode:{result.type}, trialDataId:{result.TrialDataId}, userId:{CurUser?.UserId}");
|
||
return JsonSuccessData(new { proccessType = "QuotaTrialError", TrialDataId = result.TrialDataId, message = result.errorMsg, typecode = result.type });
|
||
}
|
||
// 老风控Error会使最终类型保持QuotaTrialError,因此组合场景必须按新风控原始审批状态识别。
|
||
if (result.NewRiskNeedApproval || result.type == TradeOpenRetCode.RiskWarning.ToString())
|
||
{
|
||
// 老风控异常叠加新风控需审批时,一次特批同时放行两边;否则仍只审批新风控。
|
||
var isOldNewRiskConfirmRequired = result.OldRiskNeedSpecialApproval && result.NewRiskNeedApproval;
|
||
_logger.Info($"TradeConfirmRisk.Response tradeids:{tradeids}, proccessType:AdditionalProcessing, source:{(isOldNewRiskConfirmRequired ? "OldNewRisk" : "RiskWarning")}, type:{(isOldNewRiskConfirmRequired ? tradeBLL.OldNewRiskConfirm : tradeBLL.RiskWarningConfirm)}, typecode:{result.type}, trialDataId:{result.TrialDataId}, ignoreRiskRuleIds:{string.Join(",", result.ignoreRiskRuleIds ?? new List<string>())}, userId:{CurUser?.UserId}");
|
||
return JsonSuccessData(new { proccessType = "AdditionalProcessing", source = isOldNewRiskConfirmRequired ? "OldNewRisk" : "RiskWarning", type = isOldNewRiskConfirmRequired ? tradeBLL.OldNewRiskConfirm : tradeBLL.RiskWarningConfirm, TrialDataId = result.TrialDataId, message = result.errorMsg, typecode = result.type, ignoreRiskRuleIds = result.ignoreRiskRuleIds });
|
||
}
|
||
if (result.type == TradeOpenRetCode.FundStatus.ToString())
|
||
{
|
||
_logger.Info($"TradeConfirmRisk.Response tradeids:{tradeids}, proccessType:AdditionalProcessing, source:FundStatus, typecode:{result.type}, trialDataId:{result.TrialDataId}, userId:{CurUser?.UserId}");
|
||
return JsonSuccessData(new { proccessType = "AdditionalProcessing", source = "FundStatus", type = "", TrialDataId = result.TrialDataId, message = result.errorMsg, typecode = result.type });
|
||
}
|
||
if (result.type == TradeOpenRetCode.LackOfMoney.ToString() || ((PS.Config.ErpElement.Company == Configuration.CompanyEnum.天风 || config.SpecialOperateForTrade == 1) && string.IsNullOrWhiteSpace(result.type)))
|
||
{
|
||
_logger.Info($"TradeConfirmRisk.Response tradeids:{tradeids}, proccessType:AdditionalProcessing, source:LackOfMoney, type:{tradeBLL.LackOfMoney}, typecode:{result.type}, trialDataId:{result.TrialDataId}, userId:{CurUser?.UserId}");
|
||
return JsonSuccessData(new { proccessType = "AdditionalProcessing", source = "LackOfMoney", type = tradeBLL.LackOfMoney, TrialDataId = result.TrialDataId, message = result.errorMsg, typecode = result.type });
|
||
}
|
||
//限额试算不通过时,延用master老逻辑:老风控走AdditionalProcessing并允许前端展示“交易特批”;新风控检查失败仍只展示详情不允许审批
|
||
if (result.type == TradeOpenRetCode.QuotaTrialError.ToString())
|
||
{
|
||
if (result.OldRiskNeedSpecialApproval)
|
||
{
|
||
var oldRiskSpecialApprovalType = PS.Config.ErpElement.Company == Configuration.CompanyEnum.天风 || config.SpecialOperateForTrade == 1 ? tradeBLL.LackOfMoney : "";
|
||
_logger.Info($"TradeConfirmRisk.Response tradeids:{tradeids}, proccessType:AdditionalProcessing, source:OldRiskQuotaTrialError, type:{oldRiskSpecialApprovalType}, typecode:{result.type}, trialDataId:{result.TrialDataId}, userId:{CurUser?.UserId}");
|
||
return JsonSuccessData(new { proccessType = "AdditionalProcessing", source = "OldRiskQuotaTrialError", type = oldRiskSpecialApprovalType, TrialDataId = result.TrialDataId, message = result.errorMsg, typecode = result.type });
|
||
}
|
||
_logger.Info($"TradeConfirmRisk.Response tradeids:{tradeids}, proccessType:QuotaTrialError, source:QuotaTrialError, typecode:{result.type}, trialDataId:{result.TrialDataId}, userId:{CurUser?.UserId}");
|
||
return JsonSuccessData(new { proccessType = "QuotaTrialError", TrialDataId = result.TrialDataId, message = result.errorMsg, typecode = result.type });
|
||
}
|
||
}
|
||
|
||
//生成交易确认书
|
||
if (PS.Config.IsAutoGenerateContracts && result.confirmedTradeIds?.Count > 0)
|
||
{
|
||
new TradeContractGenerateService(CurUser).GenerateContractsAsync(result.confirmedTradeIds, "确认书");
|
||
}
|
||
//有ErrorMsg则认为失败
|
||
if (!string.IsNullOrEmpty(result.errorMsg))
|
||
{
|
||
if (result.changeConfirmPaths?.Count > 0)
|
||
{
|
||
return JsonError(string.Format("确认成交失败,原因:{0}", result.errorMsg), new { generateChangeSuccess = true, url = result.changeConfirmPaths });
|
||
}
|
||
return JsonError(string.Format("确认成交失败,原因:{0}", result.errorMsg));
|
||
}
|
||
else
|
||
{
|
||
// 特批放行只有在交易确认最终成功后才记录,避免前端点击特批但后端超时重检失败时误记通过。
|
||
if (trialDataId.HasValue)
|
||
{
|
||
var decision = string.Empty;
|
||
if (ignoreRiskWarning && ignoreMoneyCheck)
|
||
{
|
||
decision = "新风控特批、老风控交易特批通过";
|
||
}
|
||
else if (ignoreRiskWarning)
|
||
{
|
||
decision = "新风控特批通过";
|
||
}
|
||
else if (ignoreMoneyCheck)
|
||
{
|
||
decision = "老风控交易特批通过";
|
||
}
|
||
if (!string.IsNullOrWhiteSpace(decision))
|
||
{
|
||
_logger.Info($"TradeConfirmRisk.Decision tradeids:{tradeids}, trialDataId:{trialDataId}, decision:{decision}, userId:{CurUser?.UserId}");
|
||
new TradeRiskCheckLogService(CurUser).AddWarningDecisionLog(trialDataId.Value, decision);
|
||
}
|
||
}
|
||
var successMsg = string.IsNullOrWhiteSpace(result.tipMsg) ? "操作完成" : result.tipMsg;
|
||
if (result.changeConfirmPaths?.Count > 0)
|
||
{
|
||
return JsonSuccess(successMsg, new { generateChangeSuccess = true, url = result.changeConfirmPaths, TrialDataId = result.TrialDataId });
|
||
}
|
||
return JsonSuccess(successMsg, new { TrialDataId = result.TrialDataId });
|
||
}
|
||
}
|
||
|
||
public JsonResult SendChangeConfirmEmails(string tradeids)
|
||
{
|
||
if (string.IsNullOrWhiteSpace(tradeids))
|
||
{
|
||
return JsonError("交易id不能为空");
|
||
}
|
||
var int_tradeids = tradeids.Split(","[0]).Select(d => Convert.ToInt32(d)).ToList();
|
||
var tradeList = db.trade.Where(t => int_tradeids.Contains(t.id)).ToList();
|
||
|
||
var errorList = new List<string>();
|
||
try
|
||
{
|
||
tradeList.ForEach(trade =>
|
||
{
|
||
var changes = new TradeAuditLogService(CurUser).GetLastConfirmChangeMsg(trade.id);
|
||
if (changes == null || !changes.Any())
|
||
{
|
||
errorList.Add($"{trade.TradeNumber}发送变更确认书失败,因为没有变更信息");
|
||
return;
|
||
}
|
||
|
||
#region 生成邮件内容
|
||
|
||
var bodyhtml = string.Empty;
|
||
|
||
var contentSB = new StringBuilder();
|
||
contentSB.Append("<div>");
|
||
contentSB.Append($"<h3 style='text-align:center'>交易信息变更确认书</h3>");
|
||
contentSB.Append($"<p>经双方协商确定,编号为{trade.TradeNumber}的交易信息,");
|
||
foreach (var change in changes)
|
||
{
|
||
contentSB.Append(change.DisplayName).Append("由")
|
||
.Append(change.OldValue).Append("变更为").Append(change.NewValue).Append(",");
|
||
}
|
||
contentSB[contentSB.Length - 1] = '。';
|
||
contentSB.Append($"</p>");
|
||
contentSB.Append($"<p style='text-align:right;font-size:15px;font-weight:550'>{PS.Config.CompanyName ?? ""} {trade.ClientName} {valuedateBLL.ValueDate:yyyy年M月d日}</p>");
|
||
contentSB.Append("</div>");
|
||
bodyhtml = contentSB.ToString();
|
||
#endregion
|
||
|
||
// 要向该客户的所有订阅了邮件通知的人员发送邮件
|
||
var emails = ClientDataQueryService.GetClientEmails(trade.ClientId, false);
|
||
emails = emails.Where(e => !string.IsNullOrWhiteSpace(e)).ToHashSet();
|
||
if (!emails.Any())
|
||
{
|
||
errorList.Add($"{trade.TradeNumber}发送变更确认书失败,因为没有设置相关邮件接收人");
|
||
return;
|
||
}
|
||
|
||
var filePath = new TradeMetaService(CurUser).GetTradeMeta(trade.id, "交易确认书");
|
||
if (!string.IsNullOrWhiteSpace(filePath))
|
||
{
|
||
filePath = Server.MapPath(filePath);
|
||
}
|
||
|
||
var sendMail = EmailHelper.SendMail(string.Join(";", emails), "交易变更确认书", bodyhtml, true, new[] { filePath });
|
||
if (!string.IsNullOrEmpty(sendMail))
|
||
{
|
||
errorList.Add($"{trade.TradeNumber}发送变更确认书失败,因为{sendMail}");
|
||
return;
|
||
}
|
||
});
|
||
if (errorList.Count > 0)
|
||
{
|
||
return JsonError(string.Join("<br/>", errorList));
|
||
}
|
||
|
||
return JsonSuccess();
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
LogFactory.GetLogger("SendChangeConfirmEmails").Error("SendChangeConfirmEmails有异常", ex);
|
||
return JsonError("发送邮件异常");
|
||
}
|
||
|
||
}
|
||
|
||
/// <summary>
|
||
/// 结算波动率设置-选择交易,直接显示(状态:确认成交 是否有效:有效)不包含结构父交易
|
||
/// </summary>
|
||
[HttpPost]
|
||
public JsonResult tradeQueryPick(TradeReq req)
|
||
{
|
||
req.LoginUserId = CurUser.UserId;
|
||
req.TradeStatus = ConsTrade.确认成交;
|
||
if (req.TradeTypes.IsNullOrWhiteSpace())
|
||
{
|
||
req.TradeTypes = string.Join(",", ConsTrade.TradeTypesForOtcOptions);
|
||
}
|
||
req.UserAssets = CurUser.GetAssetUnitIds();
|
||
req.UserClients = CurUser.GetClientIdsByCurUser(CurUser.交易管理_查看所有交易);
|
||
var sList = new TradeQueryService(CurUser).SearchList(req, new TradeQueryRequest
|
||
{
|
||
ShowAllTrades = ShowAllTrades,
|
||
UserAssetUnits = GetUserAssetunitIds(),
|
||
StructureQueryFlag = StructureTradeQueryFlag.QuerySubs
|
||
});
|
||
foreach (var r in sList.rows)
|
||
{
|
||
if (r.TradeType == "合成价差期权")
|
||
{
|
||
r.SyntheticUnderlyingTipsInfo = synthetic_underlyingBLL.GetUnderlyingTipsInfo(r.UnderlyingCode);
|
||
}
|
||
}
|
||
return Json(sList);
|
||
}
|
||
|
||
[HttpPost]
|
||
public JsonResult tradeQuery(TradeReq req)
|
||
{
|
||
//不加这个限制前端导出就down掉了
|
||
if (req.rows < 1 || req.rows > 10000)
|
||
{
|
||
req.rows = 10000;
|
||
}
|
||
|
||
req.AssetIdList = AssetUnitModel.IntersectAssetUnits(req.AssetIdGroupList, req.AssetIdList).ToList();
|
||
req.UserAssets = CurUser.GetAssetUnitIds();
|
||
req.UserClients = CurUser.GetClientIdsByCurUser(CurUser.交易管理_查看所有交易);
|
||
req.CurUserTradeIds = CurUser.GetTradeIdsByCurUser();
|
||
|
||
var sList = new TradeQueryService(CurUser).SearchListWithGroup(req, new TradeQueryRequest
|
||
{
|
||
ShowAllTrades = ShowAllTrades,
|
||
UserAssetUnits = ShowAllTrades ? null : GetUserAssetunitIds()
|
||
});
|
||
if (sList == null && sList.rows == null || !sList.rows.Any())
|
||
{
|
||
return Json(sList);
|
||
}
|
||
var tradePairIds = sList.rows.Select(x => x.PairTrade).ToList();
|
||
var tradeList = db.trade.Where(x => tradePairIds.Contains(x.id.ToString())).ToList();
|
||
|
||
List<trade> childTradeList = null;
|
||
var tradeids = sList.rows.Select(r => r.id).ToList();
|
||
|
||
childTradeList = db.trade.AsNoTracking().Where(x => tradeids.Contains(x.ParentTradeId) && x.ParentTradeId > 0).ToList();
|
||
|
||
if (childTradeList == null)
|
||
{
|
||
childTradeList = new List<trade>();
|
||
}
|
||
|
||
|
||
var tcProvider = new TradeCashProvider(CurUser).Initialize(tradeids, childTradeList);
|
||
|
||
var realtimerisk = realtime_trade_riskBLL.GetAllrealtime_trade_valueModel();
|
||
|
||
var tradeContractCodeList = (from tradeContractR in db.trade_contract_r
|
||
where tradeids.Contains(tradeContractR.TradeId) && ContractTypeEnum.Trade == tradeContractR.Type && tradeContractR.IsValid
|
||
select tradeContractR).ToList();
|
||
|
||
var unProvider = new UnderlyingDataProvider();
|
||
new TradeDalService(CurUser).SetStructureInfo(sList.rows, childTradeList);
|
||
|
||
Dictionary<int, List<TagDto>> tradeTagList = null;
|
||
if (sList != null && sList.rows != null && sList.rows.Any())
|
||
{
|
||
using (var service = new TagService(CurUser))
|
||
{
|
||
tradeTagList = service.GetTagByTradeIds(sList.rows.Select(p => p.id).Distinct().ToList());
|
||
}
|
||
}
|
||
if (tradeTagList == null)
|
||
{
|
||
tradeTagList = new Dictionary<int, List<TagDto>>();
|
||
}
|
||
|
||
var unwindDetailList = tcProvider.BatchGetUnwindDetail(sList.rows, childTradeList);
|
||
|
||
|
||
|
||
foreach (var r in sList.rows)
|
||
{
|
||
if (req.TabIndex == (int)TradeTabIndexEnum.场外成交记录)
|
||
{
|
||
//var detail = tcProvider.GetUnwindDetail(r);
|
||
var detail = unwindDetailList.FirstOrDefault(p => p.TradeId == r.id);
|
||
if (detail != null)
|
||
{
|
||
r.UnWindDate = detail.UnWindDate;
|
||
r.UnWindTradePrice = detail.UnWindSinglePrice;
|
||
r.UnWindUnderlyingPrice = detail.UnWindUnderlyingPrice;
|
||
r.UnWindTotalAmount = detail.UnWindTotalAmount;
|
||
r.UnWindFee = detail.UnWindTotalFee;
|
||
r.UnWindTimes = detail.UnWindTimes;
|
||
r.Amount = detail.UnWindAmount;
|
||
r.FinalPrice = detail.UnWindUnderlyingPrice;
|
||
r.RealizedPnl = detail.RealizedPnl;
|
||
}
|
||
}
|
||
|
||
if (r.TradeType == "合成价差期权")
|
||
{
|
||
r.SyntheticUnderlyingTipsInfo = synthetic_underlyingBLL.GetUnderlyingTipsInfo(r.UnderlyingCode);
|
||
}
|
||
var tradePair = tradeList.FirstOrDefault(x => x.id.ToString() == r.PairTrade);
|
||
r.PairTradeNumber = tradePair == null ? "" : tradePair.TradeNumber;
|
||
r.LotsNewInfo = TradeLotsCalc.GetLots(r.UnderlyingCode, r.Notional);
|
||
|
||
var pv = realtimerisk.Where(t => t.TradeId == r.id).Select(t => new KeyValuePair<string, double?>(t.VolType, t.Pv)).ToList();
|
||
var roundedPv = realtimerisk.Where(t => t.TradeId == r.id).Select(t => new KeyValuePair<string, double?>(t.VolType, t.RoundedPv)).ToList();
|
||
var positionPnl = realtimerisk.Where(t => t.TradeId == r.id).Select(t => new KeyValuePair<string, double?>(t.VolType, t.PositionPnl)).ToList();
|
||
var roundedPositionPnl = realtimerisk.Where(t => t.TradeId == r.id).Select(t => new KeyValuePair<string, double?>(t.VolType, t.RoundedPositionPnl)).ToList();
|
||
|
||
if (r.IsGroup == 1)
|
||
{
|
||
//var childTradeIds = db.trade.Where(x => x.ParentTradeId == r.id && ConsTrade.LiveTradeStatusList.Contains(x.TradeStatus)).Select(x => x.id).ToList();
|
||
var childTradeIds = childTradeList.Where(x => x.ParentTradeId == r.id && ConsTrade.LiveTradeStatusList.Contains(x.TradeStatus)).Select(x => x.id).ToList();
|
||
pv = realtimerisk.Where(t => childTradeIds.Contains(t.TradeId ?? 0)).GroupBy(x => x.VolType).Select(t => new KeyValuePair<string, double?>(t.Key, t.Sum(g => g.Pv))).ToList();
|
||
roundedPv = realtimerisk.Where(t => childTradeIds.Contains(t.TradeId ?? 0)).GroupBy(x => x.VolType).Select(t => new KeyValuePair<string, double?>(t.Key, t.Sum(g => g.RoundedPv))).ToList();
|
||
positionPnl = realtimerisk.Where(t => childTradeIds.Contains(t.TradeId ?? 0)).GroupBy(x => x.VolType).Select(t => new KeyValuePair<string, double?>(t.Key, t.Sum(g => g.PositionPnl))).ToList();
|
||
roundedPositionPnl = realtimerisk.Where(t => childTradeIds.Contains(t.TradeId ?? 0)).GroupBy(x => x.VolType).Select(t => new KeyValuePair<string, double?>(t.Key, t.Sum(g => g.RoundedPositionPnl))).ToList();
|
||
}
|
||
|
||
if (PS.Config.IsPVRounded)
|
||
{
|
||
if (roundedPv != null && roundedPv.Count > 0)
|
||
{
|
||
r.PV = roundedPv.ToJson();
|
||
}
|
||
if (roundedPositionPnl != null && roundedPositionPnl.Count > 0)
|
||
{
|
||
r.PositionPnl = roundedPositionPnl.ToJson();
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (pv != null && pv.Count > 0)
|
||
{
|
||
r.PV = pv.ToJson();
|
||
}
|
||
if (positionPnl != null && positionPnl.Count > 0)
|
||
{
|
||
r.PositionPnl = positionPnl.ToJson();
|
||
}
|
||
}
|
||
if (r.TradeType == "场内期权" && !string.IsNullOrEmpty(r.ExchangeOptionCode))
|
||
{
|
||
var exOption = DataCacheProvider.GetExchangeListOptionDataSource().GetData(r.ExchangeOptionCode);
|
||
if (exOption != null)
|
||
{
|
||
r.UnderlyingPrice = exOption.Price;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
|
||
|
||
DataCacheProvider.GetUnderlyingDataSource().TryGetPrice(r.UnderlyingCode, out var price);
|
||
r.UnderlyingPrice = price;
|
||
}
|
||
|
||
//TradeOriginalAmount 赋值逻辑
|
||
r.TradeOriginalAmount = r.OriginalNotional;
|
||
if (!ConsTrade.TradeTypesForHedge.Contains(r.TradeType) && r.TradeType != "现金流交易")
|
||
{
|
||
var CountRatio = unProvider.GetCountRatio(r.UnderlyingCode);
|
||
r.TradeOriginalAmount = r.OriginalNotional / CountRatio;
|
||
}
|
||
|
||
//合同编号
|
||
var tradeContractCode = tradeContractCodeList.FirstOrDefault(t => t.TradeId == r.id);
|
||
r.ContractCode = tradeContractCode?.ContractCode;
|
||
r.CountRatio = DataCacheProvider.GetUnderlyingDataSource().GetData(r.UnderlyingCode)?.CountRatio ?? 1;
|
||
|
||
if (PS.Config.IsGuoJun)
|
||
{
|
||
r.UnderlyingVariety = YLErp.Modules.UnderlyingModule.UnderlyingHelper.GetUnderlyingVarietyCode(r.UnderlyingCode);
|
||
}
|
||
|
||
//拼装标签值
|
||
if (tradeTagList.ContainsKey(r.id))
|
||
{
|
||
r.Tags = tradeTagList[r.id];
|
||
r.OutputTags = TagService.GetOutputTagsStr(r.Tags);
|
||
}
|
||
}
|
||
|
||
//最新价格‘所取的值:已平仓的交易-平仓费;已行权的交易-行权收益,已到期的-行权收益(应该是0); 活着的持仓交易-QDP在刷新页面时算出来的价格
|
||
|
||
return Json(sList);
|
||
}
|
||
|
||
[HttpPost]
|
||
public JsonResult SearchGroupChildrenList(int id)
|
||
{
|
||
var trades = new TradeQueryService(CurUser).SearchGroupChildrenList(id);
|
||
|
||
var tradeids = trades.Select(r => r.id).ToList();
|
||
var tcProvider = new TradeCashProvider(CurUser).Initialize(tradeids);
|
||
|
||
var realtimerisk = realtime_trade_riskBLL.GetAllrealtime_trade_valueModel();
|
||
|
||
var tradeContractCodeList = (from tradeContractR in db.trade_contract_r
|
||
where tradeids.Contains(tradeContractR.TradeId) && ContractTypeEnum.Trade == tradeContractR.Type && tradeContractR.IsValid
|
||
select tradeContractR).ToList();
|
||
Dictionary<int, List<TagDto>> tradeTagList = null;
|
||
if (trades != null && trades.Any())
|
||
{
|
||
using (var service = new TagService(CurUser))
|
||
{
|
||
tradeTagList = service.GetTagByTradeIds(tradeids);
|
||
}
|
||
}
|
||
if (tradeTagList == null)
|
||
{
|
||
tradeTagList = new Dictionary<int, List<TagDto>>();
|
||
}
|
||
var unProvider = new UnderlyingDataProvider();
|
||
|
||
foreach (var r in trades)
|
||
{
|
||
if (r.TradeType == "障碍期权")
|
||
{
|
||
var option = db.trade_barrier_option.FirstOrDefault(x => x.TradeId == r.id);
|
||
r.KnockInOutStatusObservation = option?.KnockInOutStatusCn;
|
||
}
|
||
else if (r.TradeType == "双鲨期权")
|
||
{
|
||
var option = db.trade_double_sharkfin_option.FirstOrDefault(x => x.TradeId == r.id);
|
||
r.KnockInOutStatusObservation = option?.KnockInOutStatusCn;
|
||
}
|
||
else if (r.TradeType == "凤凰期权")
|
||
{
|
||
var option = db.trade_autocall.FirstOrDefault(x => x.TradeId == r.id);
|
||
r.KnockInOutStatusObservation = option?.KnockInOutStatusCn;
|
||
}
|
||
else if (r.TradeType == "雪球期权")
|
||
{
|
||
var option = db.trade_snowball.FirstOrDefault(x => x.TradeId == r.id);
|
||
r.KnockInOutStatusObservation = option?.KnockInOutStatusCn;
|
||
}
|
||
else if (r.TradeType == "气囊结构")
|
||
{
|
||
var option = db.trade_airbag.FirstOrDefault(x => x.TradeId == r.id);
|
||
r.KnockInOutStatusObservation = option?.KnockInOutStatusCn;
|
||
}
|
||
else if (r.TradeType == "累计期权")
|
||
{
|
||
var option = db.trade_accumulator_option.FirstOrDefault(x => x.TradeId == r.id);
|
||
r.KnockInOutStatusObservation = option?.KnockInOutStatusCn;
|
||
}
|
||
|
||
var detail = tcProvider.GetUnwindDetail(r);
|
||
if (detail != null)
|
||
{
|
||
r.UnWindDate = detail.UnWindDate;
|
||
r.UnWindTradePrice = detail.UnWindSinglePrice;
|
||
r.UnWindUnderlyingPrice = detail.UnWindUnderlyingPrice;
|
||
r.UnWindTotalAmount = detail.UnWindTotalAmount;
|
||
r.UnWindFee = detail.UnWindTotalFee;
|
||
r.UnWindTimes = detail.UnWindTimes;
|
||
r.Amount = detail.UnWindAmount;
|
||
r.FinalPrice = detail.UnWindUnderlyingPrice;
|
||
r.RealizedPnl = detail.RealizedPnl;
|
||
}
|
||
|
||
if (r.TradeType == "合成价差期权")
|
||
{
|
||
r.SyntheticUnderlyingTipsInfo = synthetic_underlyingBLL.GetUnderlyingTipsInfo(r.UnderlyingCode);
|
||
}
|
||
|
||
r.LotsNewInfo = TradeLotsCalc.GetLots(r.UnderlyingCode, r.Notional);
|
||
|
||
var pv = realtimerisk.Where(t => t.TradeId == r.id).Select(t => new KeyValuePair<string, double?>(t.VolType, t.Pv)).ToList();
|
||
var roundedPv = realtimerisk.Where(t => t.TradeId == r.id).Select(t => new KeyValuePair<string, double?>(t.VolType, t.RoundedPv)).ToList();
|
||
var positionPnl = realtimerisk.Where(t => t.TradeId == r.id).Select(t => new KeyValuePair<string, double?>(t.VolType, t.PositionPnl)).ToList();
|
||
var roundedPositionPnl = realtimerisk.Where(t => t.TradeId == r.id).Select(t => new KeyValuePair<string, double?>(t.VolType, t.RoundedPositionPnl)).ToList();
|
||
|
||
if (PS.Config.IsPVRounded)
|
||
{
|
||
if (roundedPv != null && roundedPv.Count > 0)
|
||
{
|
||
r.PV = roundedPv.ToJson();
|
||
}
|
||
if (roundedPositionPnl != null && roundedPositionPnl.Count > 0)
|
||
{
|
||
r.PositionPnl = roundedPositionPnl.ToJson();
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (pv != null && pv.Count > 0)
|
||
{
|
||
r.PV = pv.ToJson();
|
||
}
|
||
if (positionPnl != null && positionPnl.Count > 0)
|
||
{
|
||
r.PositionPnl = positionPnl.ToJson();
|
||
}
|
||
}
|
||
|
||
if (r.TradeType == "场内期权" && !string.IsNullOrEmpty(r.ExchangeOptionCode))
|
||
{
|
||
var exOption = DataCacheProvider.GetExchangeListOptionDataSource().GetData(r.ExchangeOptionCode);
|
||
if (exOption != null)
|
||
{
|
||
r.UnderlyingPrice = exOption.Price;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
DataCacheProvider.GetUnderlyingDataSource().TryGetPrice(r.UnderlyingCode, out var price);
|
||
r.UnderlyingPrice = price;
|
||
}
|
||
|
||
//TradeOriginalAmount 赋值逻辑
|
||
r.TradeOriginalAmount = r.OriginalNotional;
|
||
if (!ConsTrade.TradeTypesForHedge.Contains(r.TradeType) && r.TradeType != "现金流交易")
|
||
{
|
||
var CountRatio = unProvider.GetCountRatio(r.UnderlyingCode);
|
||
r.TradeOriginalAmount = r.OriginalNotional / CountRatio;
|
||
}
|
||
|
||
//合同编号
|
||
var tradeContractCode = tradeContractCodeList.FirstOrDefault(t => t.TradeId == r.id);
|
||
r.ContractCode = tradeContractCode?.ContractCode;
|
||
|
||
r.SalesCommission = new Modules.SalesModule.SalesCommissionDataService(CurUser).GetTradeCommissionInfo(r.id);
|
||
if (PS.Config.ErpElement.SalesCommissionCalculation == "公式1" && r.SalesCommission?.Commission != null)
|
||
{
|
||
r.SalesCommission.Commission = r.SalesCommission.Commission * r.SalesCommission.SalesIds.Count();
|
||
}
|
||
|
||
if (PS.Config.IsGuoJun)
|
||
{
|
||
r.UnderlyingVariety = YLErp.Modules.UnderlyingModule.UnderlyingHelper.GetUnderlyingVarietyCode(r.UnderlyingCode);
|
||
}
|
||
//拼装标签值
|
||
if (tradeTagList.ContainsKey(r.id))
|
||
{
|
||
r.Tags = tradeTagList[r.id];
|
||
r.OutputTags = TagService.GetOutputTagsStr(r.Tags);
|
||
}
|
||
}
|
||
|
||
return Json(trades);
|
||
}
|
||
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
/// <param name="id"></param>
|
||
/// <param name="isExerciseDate">当日到期页面关于黑箱累计期权,展开时,只展示当日到期的子交易,非当日到期的子交易不展示</param>
|
||
/// <returns></returns>
|
||
public JsonResult SearchGroupChildrenConfirmList(int id, bool isExerciseDate = false)
|
||
{
|
||
var trades = new TradeQueryService(CurUser).SearchGroupChildrenList(id).Where(x => (x.ExerciseDate == valuedateBLL.ValueDate || !isExerciseDate));
|
||
|
||
var tradeids = trades.Select(r => r.id).ToList();
|
||
var tcProvider = new TradeCashProvider(CurUser).Initialize(tradeids);
|
||
|
||
var realtimerisk = realtime_trade_riskBLL.GetAllrealtime_trade_valueModel();
|
||
|
||
var tradeContractCodeList = (from tradeContractR in db.trade_contract_r
|
||
where tradeids.Contains(tradeContractR.TradeId) && ContractTypeEnum.Trade == tradeContractR.Type && tradeContractR.IsValid
|
||
select tradeContractR).ToList();
|
||
|
||
var unProvider = new UnderlyingDataProvider();
|
||
|
||
if (trades != null && trades.Any())
|
||
{
|
||
var tradeIds = trades.Select(x => x.id).ToList();
|
||
var tradeCashQuery = from tc in db.trade_cash
|
||
where tradeIds.Contains(tc.TradeId) && (tc.Action == ClientCashInCashOut.系统操作_行权费 || tc.Action == ClientCashInCashOut.系统操作_票息 || tc.Action == ClientCashInCashOut.系统操作_互换) && tc.ValidState != "InValid"
|
||
&& !tc.IsDeleted && tc.Status == TradeCashStatusEnum.已执行 && tc.BarrierPrice == null //不包含敲出数据
|
||
select tc;
|
||
var tradeCashDatas = tradeCashQuery.ToArray();
|
||
|
||
var underlyingIds = trades.Select(x => x.UnderlyingId).ToList();
|
||
var underlyings = db.underlying_manager.Where(x => underlyingIds.Contains(x.id)).ToArray();
|
||
|
||
var underlyingTypeIds = underlyings.Select(x => x.UnderlyingTypeId).Distinct();
|
||
var varietys = db.variety.Where(x => underlyingTypeIds.Contains(x.id)).ToArray();
|
||
|
||
var result = TradeRiskCalcTaskRunner.GetCalcResult("对冲");
|
||
|
||
//new TradeDalModule.TradeDalService(this).SetStructureInfo(sList.rows);
|
||
|
||
foreach (var tradeObj in trades)
|
||
{
|
||
if (tradeObj.TradeStatus == "已执行" || tradeObj.TradeStatus == "已到期" || tradeObj.TradeStatus == "已平仓")
|
||
{
|
||
tradeObj.TradeAmount = 0;
|
||
}
|
||
|
||
var tradeCash = tradeCashDatas.OrderByDescending(x => x.id).FirstOrDefault(d => d.TradeId == tradeObj.id);
|
||
new TodayTradeQueryService(CurUser).ProcessTrade(tradeObj, tradeCash);//最后一笔到期结算流水
|
||
|
||
if (tradeObj.TradeType == "远期")
|
||
{
|
||
tradeObj.trade_forward = db.trade_forward.First(x => x.TradeId == tradeObj.id);
|
||
}
|
||
|
||
var cashTrades = db.trade_cash.Where(t => t.ValidState != ConsGlobal.InValid && t.TradeId == tradeObj.id && t.BarrierPrice == null && !t.IsDeleted).ToList();
|
||
var cashTradesExercise = cashTrades.Where(t => t.Action == ClientCashInCashOut.系统操作_行权费).ToList();
|
||
var cashTradesUnwind = cashTrades.Where(t => t.Action == ClientCashInCashOut.系统操作_平仓费).ToList();
|
||
|
||
if (tradeObj.TradeType == "收益互换")
|
||
{
|
||
var cashTradesSwap = cashTrades.Where(t => t.Action == ClientCashInCashOut.系统操作_互换).ToList();
|
||
var lastTradeCashSwap = cashTradesSwap.OrderByDescending(x => x.ValueDate).FirstOrDefault();
|
||
if (lastTradeCashSwap != null)
|
||
{
|
||
tradeObj.trade_cash.trade_cash_swap = db.trade_cash_swap.FirstOrDefault(x => x.TradeCashId == lastTradeCashSwap.id);
|
||
}
|
||
tradeObj.RealizedPnl = cashTradesSwap.Sum(x => x.Amount) - tradeObj.TradePrice * cashTradesSwap.Sum(x => x.UnwindPercentRate) * ((tradeObj.BuySell == "卖出") ? -1 : 1)
|
||
+ cashTradesUnwind.Sum(x => x.Amount) - tradeObj.TradePrice * cashTradesUnwind.Sum(x => x.UnwindPercentRate) * ((tradeObj.BuySell == "卖出") ? -1 : 1);
|
||
}
|
||
else
|
||
{
|
||
tradeObj.RealizedPnl = cashTradesExercise.Sum(x => x.Amount) - tradeObj.TradePrice * cashTradesExercise.Sum(x => x.UnwindPercentRate) * ((tradeObj.BuySell == "卖出") ? -1 : 1)
|
||
+ cashTradesUnwind.Sum(x => x.Amount) - tradeObj.TradePrice * cashTradesUnwind.Sum(x => x.UnwindPercentRate) * ((tradeObj.BuySell == "卖出") ? -1 : 1);
|
||
}
|
||
|
||
if (result != null && result.TradeRiskList != null)
|
||
{
|
||
var risk = result.TradeRiskList.FirstOrDefault(x => x.TradeId == tradeObj.id);
|
||
tradeObj.DeltaInLots = risk != null ? risk.DeltaInLots : 0;
|
||
}
|
||
|
||
var realStrike = tradeObj.IsMoneynessOptionData ? (tradeObj.SpotPrice ?? 0) * (tradeObj.Strike ?? 0) : tradeObj.Strike ?? 0;
|
||
tradeObj.ValueStatus = "-";
|
||
Modules.DataCacheModule.DataCacheManager.GetUnderlyingDataSource().TryGetPrice(tradeObj.UnderlyingCode, out var price);
|
||
tradeObj.UnderlyingPrice = price;
|
||
tradeObj.UnderlyingName = Modules.DataCacheModule.DataCacheManager.GetUnderlyingDataSource().GetData(tradeObj.UnderlyingCode)?.UnderlyingName;
|
||
if (tradeObj.IsOption() && price > 0)
|
||
{
|
||
if (realStrike == price)
|
||
{
|
||
tradeObj.ValueStatus = "ATM 100%";
|
||
}
|
||
else if ((realStrike < price && tradeObj.OptionType == "看涨") || (realStrike > price && tradeObj.OptionType == "看跌"))
|
||
{
|
||
tradeObj.ValueStatus = "ITM " + (realStrike / price * 100).ToString("0.00") + "%";
|
||
}
|
||
else
|
||
{
|
||
tradeObj.ValueStatus = "OTM " + (realStrike / price * 100).ToString("0.00") + "%";
|
||
}
|
||
}
|
||
|
||
var pv = realtimerisk.Where(t => t.TradeId == tradeObj.id).Select(t => new KeyValuePair<string, double?>(t.VolType, t.Pv)).ToList();
|
||
var roundedPv = realtimerisk.Where(t => t.TradeId == tradeObj.id).Select(t => new KeyValuePair<string, double?>(t.VolType, t.RoundedPv)).ToList();
|
||
if (PS.Config.IsPVRounded)
|
||
{
|
||
if (roundedPv != null && roundedPv.Count > 0)
|
||
{
|
||
tradeObj.PV = roundedPv.ToJson();
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (pv != null && pv.Count > 0)
|
||
{
|
||
tradeObj.PV = pv.ToJson();
|
||
}
|
||
}
|
||
|
||
if (tradeObj.TradeType == "合成价差期权")
|
||
{
|
||
tradeObj.SyntheticUnderlyingTipsInfo = synthetic_underlyingBLL.GetUnderlyingTipsInfo(tradeObj.UnderlyingCode);
|
||
}
|
||
|
||
tradeObj.SalesCommission = new Modules.SalesModule.SalesCommissionDataService(CurUser).GetTradeCommissionInfo(tradeObj.id);
|
||
if (PS.Config.ErpElement.SalesCommissionCalculation == "公式1" && tradeObj.SalesCommission?.Commission != null)
|
||
{
|
||
tradeObj.SalesCommission.Commission = tradeObj.SalesCommission.Commission * tradeObj.SalesCommission.SalesIds.Count();
|
||
}
|
||
}
|
||
}
|
||
|
||
return Json(trades);
|
||
}
|
||
|
||
public JsonResult SearchSwapGroupChildrenConfirmList(int id)
|
||
{
|
||
var trades = new TradeQueryService(CurUser).SearchGroupChildrenList(id);
|
||
|
||
var tradeids = trades.Select(r => r.id).ToList();
|
||
var swapTrades = yldb.trade_swap.Where(t => tradeids.Contains(t.TradeId)).ToList();
|
||
foreach (var r in trades)
|
||
{
|
||
r.trade_swap = swapTrades.FirstOrDefault(x => x.TradeId == r.id);
|
||
r.MetaDic.Add("GetUnderlyingName", r.trade_swap.GetUnderlyingCode == null ? "" : Modules.DataCacheModule.DataCacheManager.GetUnderlyingDataSource().GetData(r.trade_swap.GetUnderlyingCode).UnderlyingName);
|
||
r.MetaDic.Add("PayUnderlyingName", r.trade_swap.PayUnderlyingCode == null ? "" : Modules.DataCacheModule.DataCacheManager.GetUnderlyingDataSource().GetData(r.trade_swap.PayUnderlyingCode).UnderlyingName);
|
||
}
|
||
|
||
return Json(trades);
|
||
}
|
||
|
||
[HttpPost]
|
||
public JsonResult tradeQueryV2(TradeReq req)
|
||
{
|
||
req.LoginUserId = CurUser.UserId;
|
||
req.AssetIdList = AssetUnitModel.IntersectAssetUnits(req.AssetIdGroupList, req.AssetIdList).ToList();
|
||
var userAsset = CurUser.GetAssetUnitIds();
|
||
var sList = new TradeBarrierReportService(CurUser).SearchTrades(req, userAsset, false, true);
|
||
return Json(sList);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 客户行权日报告查询。
|
||
/// 查询某客户或全部客户在指定交易日可执行或可到期的交易列表(无论是否已经执行或到期)
|
||
/// </summary>
|
||
/// <param name="req">查询条件</param>
|
||
/// <param name="IsClientExerciseDateReport">是否为客户行权日报告查询,如果为true,则不分欧式美式期权,一律严格按期权到期日查询</param>
|
||
[HttpPost]
|
||
public JsonResult todayMaturityTradeQuery(TradeReq req, bool? IsClientExerciseDateReport)
|
||
{
|
||
var systemDate = valuedateBLL.ValueDate;
|
||
req.ExerciseDate = req.ExerciseDate ?? systemDate;
|
||
req.ExerciseDateStart = req.ExerciseDateStart ?? DateTime.MinValue;
|
||
req.ExerciseDateEnd = req.ExerciseDateEnd ?? DateTime.MaxValue;
|
||
req.AssetIdList = AssetUnitModel.IntersectAssetUnits(req.AssetIdGroupList, req.AssetIdList).ToList();
|
||
//req.TradeStatus = ConsTrade.确认成交;
|
||
req.TradeStatusList = new List<string> { ConsTrade.已到期, ConsTrade.已执行, ConsTrade.确认成交, ConsTrade.期初价格已确认, ConsTrade.行权待复核, ConsTrade.提前终止拒绝 };
|
||
if (req.TradeTypes == null)
|
||
{
|
||
//默认只查询期权类交易
|
||
req.TradeTypes = string.Join(",", ConsTrade.TradeTypesForOtcOptions);
|
||
}
|
||
req.LoginUserId = CurUser.UserId;
|
||
req.sidx = "ExerciseDate,UnderlyingCode,ExerciseMode,BuySell,Strike";
|
||
req.UserAssets = CurUser.GetAssetUnitIds();
|
||
req.UserClients = CurUser.GetClientIdsByCurUser(CurUser.交易管理_查看所有交易);
|
||
req.CurUserTradeIds = CurUser.GetTradeIdsByCurUser();
|
||
var sList = new TradeQueryService(CurUser).SearchList(req, new TradeQueryRequest
|
||
{
|
||
ShowAllTrades = ShowAllTrades,
|
||
UserAssetUnits = GetUserAssetunitIds(),
|
||
IsExerciseDateReport = IsClientExerciseDateReport ?? false,
|
||
StructureQueryFlag = StructureTradeQueryFlag.QuerySubs
|
||
});
|
||
|
||
foreach (var x in sList.rows)
|
||
{
|
||
if (x.TradeType == "亚式期权")
|
||
{
|
||
tradeBLL.SetFieldsByTradeType(x);
|
||
}
|
||
if (x.TradeType == "合成价差期权")
|
||
{
|
||
x.SyntheticUnderlyingTipsInfo = synthetic_underlyingBLL.GetUnderlyingTipsInfo(x.UnderlyingCode);
|
||
}
|
||
}
|
||
return Json(sList);
|
||
}
|
||
|
||
public string ChangeBuySellToClient(string BuySell)
|
||
{
|
||
return BuySell == "买入" ? "卖出" : "买入";
|
||
}
|
||
|
||
/// <summary>
|
||
/// 将单个交易标记为到期(并增加一条收益为零的trade_cash记录,直接到期的交易记录期末价格为0)
|
||
/// </summary>
|
||
public JsonResult tradeExpireConfirm(string enid, double spotPrice = 0)
|
||
{
|
||
var id = DataProtectHelper.DecryptInt(enid);
|
||
var result = new TradeExpireConfirmService(CurUser).TradeExpireConfirm(id, spotPrice);
|
||
if (result.Success)
|
||
{
|
||
return JsonSuccess(result.Message, result.Trade);
|
||
}
|
||
return JsonError(result.Message, result.Trade);
|
||
}
|
||
|
||
public JsonResult backTrade(string enid)
|
||
{
|
||
var id = DataProtectHelper.DecryptInt(enid);
|
||
var td = new TradeBackService(CurUser).Execute(id, true, TradeBackActionEnum.backTrade);
|
||
return JsonSuccess("回退成功", td);
|
||
}
|
||
|
||
public JsonResult backTradeStepped(string enid)
|
||
{
|
||
var id = DataProtectHelper.DecryptInt(enid);
|
||
var trade = db.trade.Find(id);
|
||
if (!((trade.TradeStatus == ConsTrade.确认成交 && (trade.Notional != trade.OriginalNotional || trade.StockEqvNotional != trade.OriginalStockEqvNotional || trade.Warning)) || trade.TradeStatus == ConsTrade.已平仓 || trade.TradeStatus == ConsTrade.已执行 || trade.TradeStatus == ConsTrade.已到期))
|
||
{
|
||
return JsonError("该交易当前状态下不可回退");
|
||
}
|
||
var td = new TradeBackService(CurUser).Execute(id, trade.Warning, TradeBackActionEnum.backTradeStepped);
|
||
return JsonSuccess("回退成功", td);
|
||
}
|
||
|
||
public JsonResult backGroupTradeStepped(string enid)
|
||
{
|
||
var id = DataProtectHelper.DecryptInt(enid);
|
||
var trade = db.trade.Find(id);
|
||
if (!(db.trade_cash.Any(x => x.TradeId == trade.id && x.Action != "系统操作-期权费") || trade.Warning))
|
||
{
|
||
return JsonError("该交易当前状态下不可回退");
|
||
}
|
||
|
||
var childTrades = db.trade.Where(x => x.ParentTradeId == id);
|
||
if (childTrades.Any(x => x.TradeType == "雪球期权" || x.TradeType == "凤凰期权"))
|
||
{
|
||
var td = new TradeBackService(CurUser).BackGroup(id, true, TradeBackActionEnum.backTradeStepped);
|
||
return JsonSuccess("回退成功", td);
|
||
}
|
||
else
|
||
{
|
||
var td = new TradeBackService(CurUser).BackGroup(id, trade.Warning, TradeBackActionEnum.backTradeStepped);
|
||
return JsonSuccess("回退成功", td);
|
||
}
|
||
}
|
||
|
||
public ActionResult tradeBack(string enid)
|
||
{
|
||
var id = DataProtectHelper.DecryptInt(enid);
|
||
var trade = db.trade.Find(id);
|
||
var model = new TradeBackModel()
|
||
{
|
||
TradeId = id,
|
||
ValueDate = valuedateBLL.ValueDate <= trade.ExerciseDate ? valuedateBLL.ValueDate : trade.ExerciseDate.Value,
|
||
TradeDate = trade.TradeDate.Value
|
||
};
|
||
return View(model);
|
||
}
|
||
|
||
public JsonResult backTradeByDate(TradeBackModel model)
|
||
{
|
||
var service = new TradeBackService(CurUser);
|
||
var trade = db.trade.Find(model.TradeId);
|
||
|
||
var td = service.Execute(model.TradeId, model.ValueDate);
|
||
if (trade.IsGroup == 1)
|
||
{
|
||
var trades = db.trade.Where(x => x.ParentTradeId == model.TradeId && x.ValidState != "InValid").ToList();
|
||
trades.ForEach(x =>
|
||
{
|
||
service.Execute(x.id, model.ValueDate, true);
|
||
});
|
||
}
|
||
return JsonSuccess("回退成功", td);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 将多个交易标记为到期
|
||
/// </summary>
|
||
/// <param name="tradeIds">以逗号隔开的未加密交易id</param>
|
||
public JsonResult MultipleTradeExpireConfirm(IEnumerable<int> tradeIds)
|
||
{
|
||
new TradeExpireConfirmService(CurUser).MultipleTradeExpireConfirm(tradeIds, out var successMsg);
|
||
return JsonSuccess(successMsg);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 根据主键获取
|
||
/// </summary>
|
||
[HttpGet]
|
||
public JsonResult tradeGetById(int id)
|
||
{
|
||
var data = db.trade.Find(id);
|
||
return Json(data);
|
||
}
|
||
|
||
public ActionResult tradeEdit(string enid, bool isUseApproval = false)
|
||
{
|
||
var structureTypes =
|
||
new StructureService(CurUser)
|
||
.QueryStructureInfo(StructureRangeEnum.CUSTOM_TRADE)
|
||
.Select(O => new SelectListItem()
|
||
{
|
||
Text = O.StructureName,
|
||
Value = O.StructureName
|
||
})
|
||
.ToList();
|
||
ViewBag.StructureTypes = structureTypes;
|
||
ViewBag.isUseApproval = isUseApproval;
|
||
using (var tagService = new TagService(CurUser))
|
||
{
|
||
ViewBag.TagList = tagService.GetTagListByType(TagTypeEnum.Trade);
|
||
}
|
||
ViewBag.IsCheck = false;
|
||
return TradeEditV2(enid);
|
||
}
|
||
|
||
|
||
public ActionResult EditRemarkInfo(string enid)
|
||
{
|
||
var intid = DecryptInt(enid);
|
||
var td = new TradeDetailsQueryService(CurUser).GetOtcTradeFull(intid);
|
||
return View(td);
|
||
}
|
||
|
||
public JsonResult SaveComments(string enid, string Comments)
|
||
{
|
||
var intid = DecryptInt(enid);
|
||
var td = db.trade.Find(intid);
|
||
var td_copy = td.Clone();
|
||
td.Comments = Comments;
|
||
var changes = DataChangeHelper.GetDataChanges(td_copy, td);
|
||
db.TradeAuditLog.Add(new TradeAuditLog
|
||
{
|
||
TradeId = td.id,
|
||
Changes = changes.ToJson(),
|
||
DataType = "00",
|
||
OptType = "修改备注",
|
||
OptId = UserId,
|
||
OptName = UserName,
|
||
OptDate = DateTime.Now,
|
||
AuditFlag = TradeAuditFlag.operation
|
||
});
|
||
db.SaveChanges();
|
||
return JsonSuccess("修改备注成功");
|
||
}
|
||
|
||
/// <summary>
|
||
/// 设置观察日或互换日
|
||
/// </summary>
|
||
/// <param name="observationNum"></param>
|
||
/// <param name="observationUnit"></param>
|
||
/// <param name="observationHolidayType"></param>
|
||
/// <param name="startTime"></param>
|
||
/// <param name="endTime"></param>
|
||
/// <param name="alignEnd"></param>
|
||
/// <param name="btnId"></param>
|
||
/// <param name="title1">观察日对应的第一个属性名(例如凤凰期权障碍价格;互换的互换利率)</param>
|
||
/// <param name="title2">观察日对应的第二个属性名(例如凤凰期权票息;互换没有互换日期对应的第二属性,默认stringEmpty)</param>
|
||
/// <param name="title3">观察日对应的第三个属性名(例如收益互换类型:是否结算)</param>
|
||
/// <returns></returns>
|
||
public ActionResult tradeObservationDates(
|
||
string observationNum,
|
||
string observationUnit,
|
||
string observationHolidayType,
|
||
string Isavg,
|
||
string argDate,
|
||
string tradeType,
|
||
DateTime startTime,
|
||
DateTime endTime,
|
||
bool alignEnd,
|
||
string btnId,
|
||
string title1 = null,
|
||
string title2 = null,
|
||
string title3 = null,
|
||
bool isTitle2TrueFalse = false,
|
||
bool isTitle1Percent = false,
|
||
bool isTitle2Percent = false,
|
||
bool isTitle3Percent = false,
|
||
decimal? defaultTitle1Value = null,
|
||
decimal? defaultTitle2Value = null,
|
||
decimal? defaultTitle3Value = null,
|
||
bool hideTips = false,
|
||
string dateTitle = null,
|
||
bool showDate2 = false,
|
||
string date2Title = null,
|
||
bool showDate2OffsetControl = false,
|
||
string date2OffsetControlTitle = null,
|
||
int couponDayInterval = 0,
|
||
string Comments = "",
|
||
string calcMode = "01",
|
||
bool showCloseCheck = false,
|
||
string ObservationFrequency = null)
|
||
{
|
||
var model = new ObservationDatesModel
|
||
{
|
||
TradeType = tradeType,
|
||
ObservationHolidayType = string.IsNullOrEmpty(observationHolidayType) ? "Following" : observationHolidayType,
|
||
ObservationNum = string.IsNullOrEmpty(observationNum) ? "1" : observationNum,
|
||
ObservationUnit = string.IsNullOrEmpty(observationUnit) ? "D" : observationUnit,
|
||
ObservationFrequency = string.IsNullOrEmpty(ObservationFrequency) ? "" : ObservationFrequency,
|
||
Isavg = Isavg,
|
||
argDate = argDate,
|
||
|
||
startTime = startTime,
|
||
endTime = endTime,
|
||
AlignEnd = alignEnd,
|
||
BtnId = btnId,
|
||
Title1 = title1,
|
||
Title2 = title2,
|
||
Title3 = title3,
|
||
isTitle2TrueFalse = isTitle2TrueFalse,
|
||
IsTitle1Percent = isTitle1Percent,
|
||
IsTitle2Percent = isTitle2Percent,
|
||
IsTitle3Percent = isTitle3Percent,
|
||
DefaultTitle1Value = defaultTitle1Value,
|
||
DefaultTitle2Value = defaultTitle2Value,
|
||
DefaultTitle3Value = defaultTitle3Value,
|
||
HideTips = hideTips,
|
||
DateTitle = dateTitle,
|
||
ShowDate2 = showDate2,
|
||
Date2Title = date2Title,
|
||
ShowDate2OffsetControl = showDate2OffsetControl,
|
||
Date2OffsetControlTitle = date2OffsetControlTitle,
|
||
CouponDayInterval = couponDayInterval,
|
||
Comments = Comments,
|
||
CalcMode = calcMode,
|
||
ShowCloseCheck = showCloseCheck
|
||
};
|
||
|
||
return View(model);
|
||
}
|
||
|
||
|
||
/// <summary>
|
||
/// 设置 均价结算日
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
public ActionResult tradeAveragePriceDates(
|
||
string observationNum,
|
||
string observationUnit,
|
||
string observationHolidayType,
|
||
DateTime startTime,
|
||
DateTime endTime,
|
||
DateTime tradeDate,
|
||
string btnId,
|
||
string Comments = "")
|
||
{
|
||
var model = new ObservationDatesModel()
|
||
{
|
||
ObservationNum = string.IsNullOrEmpty(observationNum) ? "1" : observationNum,
|
||
ObservationHolidayType = string.IsNullOrEmpty(observationHolidayType) ? "Following" : observationHolidayType,
|
||
ObservationUnit = string.IsNullOrEmpty(observationUnit) ? "D" : observationUnit,
|
||
startTime = startTime,
|
||
endTime = endTime,
|
||
BtnId = btnId,
|
||
Comments = Comments,
|
||
tradeDate = tradeDate,
|
||
};
|
||
return View(model);
|
||
}
|
||
|
||
public ActionResult tradeObservationStatusList(int tabIndex = (int)ObservationStatusTradeEnum.Barrier)
|
||
{
|
||
ViewBag.TabIndex = tabIndex;
|
||
return View();
|
||
}
|
||
|
||
public ActionResult tradeObservationDateInfoList(string title1 = null, string title2 = null, bool isTitle1Percent = false, bool isTitle2Percent = false)
|
||
{
|
||
ViewBag.Title1 = title1;
|
||
ViewBag.Title2 = title2;
|
||
ViewBag.IsTitle1Percent = isTitle1Percent;
|
||
ViewBag.IsTitle2Percent = isTitle2Percent;
|
||
return View();
|
||
}
|
||
|
||
[HttpPost]
|
||
public JsonResult GetObservationDates(DateTime startTime, DateTime endTime, string termStr, string observationHolidayType, bool alignEnd)
|
||
{
|
||
var bdc = (BusinessDayConvention)Enum.Parse(typeof(BusinessDayConvention), observationHolidayType);
|
||
return JsonSuccess("", QdpObservationHelper.GetObservationDateString(startTime, endTime, termStr, bdc, alignEnd));
|
||
}
|
||
|
||
[HttpPost]
|
||
public JsonResult GetObservationDateList(GetObservationDateRequest req)
|
||
{
|
||
var bdc = (BusinessDayConvention)Enum.Parse(typeof(BusinessDayConvention), req.holidayAdjustment);
|
||
return JsonSuccess("", QdpObservationHelper.GetDatesWithFixedTerm(req.startDate, req.endDate, req.termStr, bdc, req.alignEnd, req.calcMode));
|
||
}
|
||
|
||
[HttpPost]
|
||
public JsonResult GetSwapObservationDateList(GetSwapObservationDateRequest req)
|
||
{
|
||
var bdc = (BusinessDayConvention)Enum.Parse(typeof(BusinessDayConvention), req.holidayAdjustment);
|
||
var results = QdpObservationHelper.GetObservationAndSettleDates(req.startDate, req.endDate, req.termStr, req.calendar, req.settlementRules, bdc, req.alignEnd, req.calcMode);
|
||
return JsonSuccess("", results);
|
||
}
|
||
|
||
public ActionResult StructureList(string structure, string CalcId, bool onlyshow = false)
|
||
{
|
||
var ret = new DZStructureService(CurUser).getStructureList(structure);
|
||
ViewBag.CalcId = CalcId;
|
||
ViewBag.onlyshow = onlyshow;
|
||
return View(ret);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 根据一组日期序列和偏移量计算出另一组日期序列
|
||
/// </summary>
|
||
/// <param name="dates">日期序列</param>
|
||
/// <param name="offset">偏移量</param>
|
||
/// <param name="observationHolidayType">对齐类型</param>
|
||
/// <returns></returns>
|
||
[HttpPost]
|
||
public JsonResult GetObservationDateListOfDates(DateTime[] dates, int offset, BusinessDayConvention holidayAdjustment)
|
||
{
|
||
var list = new DateTime[dates.Length];
|
||
for (var i = 0; i < dates.Length; i++)
|
||
{
|
||
var d = dates[i].AddDays(offset);
|
||
switch (holidayAdjustment)
|
||
{
|
||
case BusinessDayConvention.Following:
|
||
list[i] = QdpCalendarHelper.GetNonHoliday(d);
|
||
break;
|
||
case BusinessDayConvention.Previous:
|
||
list[i] = QdpCalendarHelper.GetNonHolidayDefore(d);
|
||
break;
|
||
default:
|
||
list[i] = d;
|
||
break;
|
||
}
|
||
}
|
||
return JsonSuccess("", list);
|
||
}
|
||
|
||
public ActionResult tradeEditGroup(trade trade, int[] tradeIds)
|
||
{
|
||
if (trade.id > 0)
|
||
{
|
||
trade = db.trade.Find(trade.id);
|
||
tradeIds = db.trade.Where(x => x.ParentTradeId == trade.id).Select(x => x.id).ToArray();
|
||
}
|
||
|
||
var model = new TradeEditViewModel(CurUser, UserBLL.IsTradeOfCurrentLogin(CurUser.UserId))
|
||
{
|
||
IsCheck = false
|
||
};
|
||
|
||
trade.TradeType = trade.StructureType;
|
||
var tradeFull = new TradeDetailsQueryService(CurUser).FromDbTrade(trade);
|
||
if (trade.id == 0)
|
||
{
|
||
tradeFull.StructureType = "气囊结构";
|
||
tradeFull.OptionType = "看涨";
|
||
tradeFull.BarrierLow = 0.8;
|
||
tradeFull.Strike = 1;
|
||
tradeFull.NotKIParticipationRate = 1;
|
||
tradeFull.KIParticipationRate = 1;
|
||
|
||
if (tradeIds.Any())
|
||
{
|
||
tradeFull.MetaDic = new TradeMetaService(CurUser).GetTradeMeta(tradeIds.FirstOrDefault());
|
||
}
|
||
|
||
ViewBag.StructureTypeMap = GetStructureMap(StructureRangeEnum.BALCK_TRADE);
|
||
}
|
||
else
|
||
{
|
||
tradeFull.MetaDic.TryGetValue(ConsTradeMetaKey.tradeExtendInfo, out var structureType);
|
||
ViewBag.StructureTypeMap = GetStructureMap(StructureRangeEnum.BALCK_TRADE, tradeFull, tradeFull.StructureType);
|
||
}
|
||
tradeFull.TradeType = "结构化交易";
|
||
tradeFull.StockEqvNotionalMax = tradeFull.StockEqvNotional;
|
||
var un = underlying_managerBLL.GetByCode(tradeFull.UnderlyingCode);
|
||
if (un == null)
|
||
{
|
||
throw new ServiceException("不支持没有标的的组合交易");
|
||
}
|
||
var variety = DataCacheProvider.GetVarietyDataSource().GetData(un.UnderlyingTypeId);
|
||
ViewBag.variety = variety;
|
||
ViewBag.TradeIds = tradeIds;
|
||
|
||
model.Trade = tradeFull;
|
||
if (trade.id > 0)
|
||
{
|
||
using (var tagService = new TagService(CurUser))
|
||
{
|
||
model.Tags = tagService.GetTagByTradeId(trade.id);
|
||
}
|
||
}
|
||
|
||
using (var tagService = new TagService(CurUser))
|
||
{
|
||
ViewBag.TagList = tagService.GetTagListByType(TagTypeEnum.Trade);
|
||
}
|
||
ViewBag.IsCheck = false;
|
||
return View("TradeEditGroup", model);
|
||
}
|
||
|
||
public ActionResult tradeCheckGroup(int? enid, bool isUseApproval = false)
|
||
{
|
||
var model = new TradeEditViewModel(CurUser, UserBLL.IsTradeOfCurrentLogin(CurUser.UserId))
|
||
{
|
||
IsCheck = true
|
||
};
|
||
var trade = db.trade.Find(enid);
|
||
trade.TradeType = trade.StructureType;
|
||
if (isUseApproval)
|
||
{
|
||
model.IsCheck = false;
|
||
}
|
||
|
||
ViewBag.abledColumn = TradeCheckUtil.GetCheckFields(trade);
|
||
ViewBag.isUseApproval = isUseApproval;
|
||
var tradeFull = new TradeDetailsQueryService(CurUser).FromDbTrade(trade);
|
||
tradeFull.TradeType = "结构化交易";
|
||
if (tradeFull.IsUsePremiumRate != true)
|
||
{
|
||
tradeFull.IsUsePremiumRate = false;
|
||
}
|
||
trade.MetaDic = new TradeMetaService(CurUser).GetTradeMeta(trade.id);
|
||
|
||
if (!isUseApproval)
|
||
{
|
||
tradeFull.ClientId = 0;
|
||
tradeFull.ExerciseDate = null;
|
||
tradeFull.TradeAmount = 0;
|
||
tradeFull.Notional = 0;
|
||
tradeFull.TradeSinglePrice = 0;
|
||
tradeFull.PremiumRate = 0;
|
||
tradeFull.StockEqvNotional = 0;
|
||
}
|
||
|
||
switch (tradeFull.StructureType)
|
||
{
|
||
case "气囊结构":
|
||
if (!isUseApproval)
|
||
{
|
||
tradeFull.Strike = 0;
|
||
tradeFull.BarrierLow = 0;
|
||
tradeFull.KIParticipationRate = 0;
|
||
tradeFull.NotKIParticipationRate = 0;
|
||
tradeFull.HighStrike = 0;
|
||
tradeFull.NotKIParticipationRate = 0;
|
||
}
|
||
break;
|
||
default:
|
||
var propertys = tradeFull.Propertys ?? new List<ExtendInfoModel>();
|
||
if (isUseApproval == false)
|
||
{
|
||
propertys.ForEach(x => x.value = "");
|
||
}
|
||
tradeFull.ExtendInfo = JsonHelper.Serialize(propertys);
|
||
break;
|
||
}
|
||
model.Trade = tradeFull;
|
||
|
||
var un = underlying_managerBLL.GetByCode(tradeFull.UnderlyingCode);
|
||
var variety = DataCacheProvider.GetVarietyDataSource().GetData(un.UnderlyingTypeId);
|
||
ViewBag.variety = variety;
|
||
|
||
var subTradeIds = db.trade.Where(x => x.ParentTradeId == trade.id).Select(x => x.id).ToArray();
|
||
ViewBag.TradeIds = subTradeIds;
|
||
|
||
ViewBag.StructureTypeMap = GetStructureMap(StructureRangeEnum.BALCK_TRADE, tradeFull, tradeFull.StructureType);
|
||
using (var tagService = new TagService(CurUser))
|
||
{
|
||
model.Tags = tagService.GetTagByTradeId(trade.id);
|
||
}
|
||
|
||
using (var tagService = new TagService(CurUser))
|
||
{
|
||
ViewBag.TagList = tagService.GetTagListByType(TagTypeEnum.Trade);
|
||
}
|
||
ViewBag.IsCheck = true;
|
||
return View("TradeEditGroup", model);
|
||
}
|
||
|
||
public ActionResult tradeCheck(int? enid)
|
||
{
|
||
var model = new TradeEditViewModel(CurUser, UserBLL.IsTradeOfCurrentLogin(CurUser.UserId))
|
||
{
|
||
IsCheck = true
|
||
};
|
||
ViewBag.IsCheck = true;
|
||
var trade = new trade();
|
||
if (enid > 0)
|
||
{
|
||
trade = db.trade.Find(enid);
|
||
using (var tagService = new TagService(CurUser))
|
||
{
|
||
model.Tags = tagService.GetTagByTradeId(trade.id);
|
||
}
|
||
ViewBag.abledColumn = TradeCheckUtil.GetCheckFields(trade);
|
||
var tradeFull = new TradeDetailsQueryService(CurUser).FromDbTrade(trade);
|
||
if (tradeFull.IsUsePremiumRate != true)
|
||
{
|
||
tradeFull.IsUsePremiumRate = false;
|
||
}
|
||
trade.MetaDic = new TradeMetaService(CurUser).GetTradeMeta(trade.id);
|
||
tradeFull.SalesCommission = new SalesCommissionDataService(CurUser).GetTradeCommissionInfo(trade.id);
|
||
if (PS.Config.ErpElement.SalesCommissionCalculation == "公式1")
|
||
{//计提法只支持百分比;
|
||
if (tradeFull.SalesCommission.Commission.Normalize() == 0)
|
||
{
|
||
tradeFull.SalesCommission.Commission = 1;
|
||
tradeFull.SalesCommission.CommissionFixed = false;
|
||
}
|
||
else
|
||
{
|
||
tradeFull.SalesCommission.Commission = tradeFull.SalesCommission.Commission * tradeFull.SalesCommission.SalesIds.Count();
|
||
}
|
||
}
|
||
|
||
var propertys = tradeFull.Propertys ?? new List<ExtendInfoModel>();
|
||
// if (!"自定义交易".Equals(trade.TradeType))
|
||
// {
|
||
propertys.ForEach(x => x.value = "");
|
||
// }
|
||
|
||
if (PS.Config.Is宏源 && trade.TradeType != "现金流交易")
|
||
{
|
||
var ttm = QdpCalendarHelper.GetNonHolidayDaysBetween(trade.TradeDate.Value, trade.ExerciseDate.Value) + 1;
|
||
var userGroup = UserBLL.GetUserGroup(trade.TraderId);
|
||
var vol = VolatilityHelper.GetVol(trade.TradeDate.Value, "交易", trade.UnderlyingCode, userGroup);
|
||
//TODO:宏源审核开仓波动率
|
||
var volCurve = VolCaculator.Instance.GetHistoricalVolCurvePointsEx(trade.UnderlyingCode, trade.TradeDate, ttm, ttm, vol.ReviewDownLimit, vol.ReviewUpLimit);
|
||
ViewBag.highVolLimit = volCurve.Points.Count == 0 ? 1 : volCurve.PercentileHigh;
|
||
ViewBag.lowVolLimit = volCurve.Points.Count == 0 ? 0 : volCurve.PercentileLow;
|
||
}
|
||
var tradeCheck = db.trade_check.FirstOrDefault(t => t.TradeId == trade.id && t.ValidState != "InValid");
|
||
if (tradeCheck != null)
|
||
{
|
||
var reviewTrade = tradeCheck.TradeModel;
|
||
var reviewTradeFull = new TradeDetailsQueryService(CurUser).FromDbTrade(reviewTrade, false);
|
||
new TradeExtendService(CurUser).SetTradeExtend(reviewTradeFull, reviewTrade);
|
||
reviewTradeFull.MetaDic = tradeFull.MetaDic;
|
||
//销售员不用复核
|
||
reviewTradeFull.SalesCommission = tradeFull.SalesCommission;
|
||
//预付金算法不复核
|
||
reviewTradeFull.MarginTemplateName = tradeFull.MarginTemplateName;
|
||
reviewTradeFull.MarginType = tradeFull.MarginType;
|
||
reviewTradeFull.MarginRate = tradeFull.MarginRate;
|
||
reviewTradeFull.PositionMarginRate = tradeFull.PositionMarginRate;
|
||
reviewTradeFull.InitialMargin = tradeFull.InitialMargin;
|
||
ViewBag.diffList = TradeCheckUtil.GetDiffs(trade, reviewTrade);
|
||
|
||
if (tradeFull.IsTradePricePayType == true)
|
||
{
|
||
//是否是名义本金方式成交,有一些相关属性,是通过换算得到,也赋上对应的值
|
||
if (tradeFull.IsUsePremiumRate == true)
|
||
{
|
||
reviewTradeFull.Notional = (reviewTradeFull.SpotPrice ?? 0) == 0 ? 0 : TradeHelper.GetStockEqvNotionalReal(reviewTradeFull.StockEqvNotional, reviewTradeFull.ParticipationRate, reviewTradeFull.AnnualizeFactor) / reviewTradeFull.SpotPrice.Value;
|
||
reviewTradeFull.TradeAmount = tradeFull.Notional == 0 ? 0 : reviewTradeFull.Notional * tradeFull.TradeAmount / tradeFull.Notional;
|
||
reviewTradeFull.TradeSinglePrice = TradeHelper.GetTradeSinglePriceByTradePrice(reviewTradeFull.TradePrice, reviewTradeFull.Notional, reviewTradeFull.PrincipalSum(), reviewTradeFull.BuySell, reviewTradeFull.TradeType, true);
|
||
reviewTradeFull.PremiumRate = TradeHelper.GetPremiumRateByTradePrice(reviewTradeFull.TradePrice, reviewTradeFull.StockEqvNotional, reviewTradeFull.ParticipationRate, reviewTradeFull.PrincipalSum(), reviewTradeFull.AnnualizeFactor, reviewTradeFull.BuySell, reviewTradeFull.TradeType, true);
|
||
}
|
||
else
|
||
{
|
||
reviewTradeFull.StockEqvNotional = TradeHelper.GetStockEqvNotional(reviewTradeFull.Notional * reviewTradeFull.SpotPrice, reviewTrade.ParticipationRate, reviewTrade.AnnualizeFactor);
|
||
reviewTradeFull.TradeSinglePrice = TradeHelper.GetTradeSinglePriceByTradePrice(reviewTradeFull.TradePrice, reviewTradeFull.Notional, reviewTradeFull.PrincipalSum(), reviewTradeFull.BuySell, reviewTradeFull.TradeType, true);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
//是否是名义本金方式成交,有一些相关属性,是通过换算得到,也赋上对应的值
|
||
if (tradeFull.IsUsePremiumRate == true)
|
||
{
|
||
reviewTradeFull.Notional = (reviewTradeFull.SpotPrice ?? 0) == 0 ? 0 : TradeHelper.GetStockEqvNotionalReal(reviewTradeFull.StockEqvNotional, reviewTradeFull.ParticipationRate, reviewTradeFull.AnnualizeFactor) / reviewTradeFull.SpotPrice.Value;
|
||
reviewTradeFull.TradeAmount = tradeFull.Notional == 0 ? 0 : reviewTradeFull.Notional * tradeFull.TradeAmount / tradeFull.Notional;
|
||
reviewTradeFull.TradeSinglePrice = TradeHelper.GetTradeSinglePriceByTradePrice(reviewTradeFull.TradePrice, reviewTradeFull.Notional, reviewTradeFull.PrincipalSum(), reviewTradeFull.BuySell, reviewTradeFull.TradeType, true);
|
||
reviewTradeFull.TradePrice = TradeHelper.GetTradePriceByPremiumRate(reviewTradeFull.PremiumRate, reviewTradeFull.StockEqvNotional, reviewTradeFull.ParticipationRate, reviewTradeFull.PrincipalSum(), reviewTradeFull.AnnualizeFactor, reviewTradeFull.BuySell, reviewTradeFull.TradeType, true);
|
||
}
|
||
else
|
||
{
|
||
reviewTradeFull.StockEqvNotional = TradeHelper.GetStockEqvNotional(reviewTradeFull.Notional * reviewTradeFull.SpotPrice, reviewTradeFull.ParticipationRate, reviewTradeFull.AnnualizeFactor);
|
||
reviewTradeFull.TradePrice = TradeHelper.GetTradePriceBySinglePrice(reviewTradeFull.TradeSinglePrice, reviewTradeFull.Notional, reviewTradeFull.PrincipalSum(), reviewTradeFull.BuySell, reviewTradeFull.TradeType, true);
|
||
}
|
||
}
|
||
|
||
reviewTradeFull.IsUsePremiumRate = tradeFull.IsUsePremiumRate;
|
||
|
||
if (reviewTrade.IsMoneynessOption == "是")
|
||
{
|
||
reviewTrade.Strike *= 100;
|
||
}
|
||
|
||
ViewBag.StructureTypeMap = GetStructureMap(StructureRangeEnum.CUSTOM_TRADE, tradeFull, tradeFull.StructureType);
|
||
tradeFull.MetaDic.TryGetValue(ConsTradeMetaKey.tradeExtendInfo, out var structureType1);
|
||
var map1 = GetStructureMap(StructureRangeEnum.EXTEND_INFO, tradeFull, structureType1);
|
||
ViewBag.ExtendInfoMap = new Dictionary<string, List<Structure_Details>>();
|
||
if (tradeFull.TradeType != "自定义交易" && propertys.Count > 0)
|
||
{
|
||
ViewBag.ExtendInfoMap[""] = propertys.Select(O => new Structure_Details() { ColumnName = O.name, ColumnDefaultValue = O.value }).ToList();
|
||
}
|
||
foreach (var item in map1)
|
||
{
|
||
ViewBag.ExtendInfoMap[item.Key] = item.Value;
|
||
}
|
||
|
||
reviewTradeFull.ExtendInfo = JsonHelper.Serialize(propertys);
|
||
|
||
model.Trade = reviewTradeFull;
|
||
return View("TradeEditV2", model);
|
||
}
|
||
ViewBag.TradeType = tradeFull.TradeType;
|
||
tradeFull.ClientId = 0;
|
||
tradeFull.ExerciseDate = null;
|
||
tradeFull.SettlementDate = null;
|
||
tradeFull.IsMoneynessOption = "否";
|
||
tradeFull.Strike = null;
|
||
tradeFull.TradeAmount = 0;
|
||
tradeFull.Notional = 0;
|
||
tradeFull.TradeSinglePrice = null;
|
||
tradeFull.PremiumRate = null;
|
||
tradeFull.TradeDate = null;
|
||
tradeFull.SpotPrice = null;
|
||
tradeFull.StockEqvNotional = 0;
|
||
tradeFull.StockEqvNotionalReal = 0;
|
||
tradeFull.ParticipationRate = null;
|
||
tradeFull.PrincipalRate = null;
|
||
tradeFull.OriginalPrincipalSum = null;
|
||
tradeFull.SinglePrincipalWrite = null;
|
||
tradeFull.PrincipalRateWrite = null;
|
||
tradeFull.TradePrice = null;
|
||
tradeFull.BuySell = "卖出";
|
||
tradeFull.ExerciseMode = "European";
|
||
tradeFull.OptionType = "看涨";
|
||
tradeFull.SettlementType = 0;
|
||
tradeFull.IsAnnualized = false;
|
||
tradeFull.AnnualizeFactor = null;
|
||
|
||
tradeFull.StockEqvNotional = 0;
|
||
tradeFull.OriginalNotional = 0;
|
||
tradeFull.OriginalStockEqvNotional = 0;
|
||
tradeFull.EnhancedPrice = 0;
|
||
var type = tradeFull.GetType();
|
||
var props = type.GetProperties().Where(p => p.CanRead && p.CanWrite && p.DeclaringType == type && p.Name != nameof(tradeFull.ClientNumber)).ToArray();
|
||
foreach (var p in props)
|
||
{
|
||
p.SetValue(tradeFull, p.PropertyType.IsValueType && Nullable.GetUnderlyingType(p.PropertyType) == null ? Activator.CreateInstance(p.PropertyType) : null);
|
||
}
|
||
|
||
tradeFull.MonitorType = "离散";
|
||
tradeFull.RebateType = "AtHit";
|
||
tradeFull.KORebateType = RebateTypeEnum.AtHit;
|
||
tradeFull.KOPayoffType = KOPayoffTypeEnum.Rebate;
|
||
tradeFull.KIPayoffType = KIPayoffTypeEnum.None;
|
||
tradeFull.CouponPayType = CouponPayTypeEnum.AtCreated;
|
||
tradeFull.IncludeCouponAfterKI = true;
|
||
tradeFull.IsDiscreteMonitored = true;
|
||
tradeFull.HasPayoffLimit = true;
|
||
tradeFull.CouponPercent = true;
|
||
|
||
tradeFull.CallMultiplier = tradeFull.PutMultiplier = 1;
|
||
|
||
var setreviewTradeFull = new TradeDetailsQueryService(CurUser).FromDbTrade(trade);
|
||
switch (tradeFull.TradeType)
|
||
{
|
||
case "现金流交易":
|
||
tradeFull.OptionType = null;
|
||
tradeFull.RateType = CashFlowRateTypeEnum.年化利率;
|
||
tradeFull.DepositType = CashflowDepositTypeEnum.资金收益;
|
||
tradeFull.CouponDayCount = "";
|
||
tradeFull.ExerciseMode = "";
|
||
break;
|
||
case "合成价差期权":
|
||
var synthetic = synthetic_underlyingBLL.GetByName(tradeFull.UnderlyingCode);
|
||
if (synthetic != null)
|
||
{
|
||
tradeFull.MetaDic["组合标的"] = synthetic.GetSyntheticPriceModel().ToJson();
|
||
}
|
||
break;
|
||
case "凤凰期权":
|
||
tradeFull.KOObservationDates = db.trade_autocall.FirstOrDefault(l => l.TradeId == tradeFull.id)?.KOObservationDates;
|
||
break;
|
||
case "雪球期权":
|
||
tradeFull.CouponDayCount = setreviewTradeFull.CouponDayCount;
|
||
tradeFull.CouponIncludeStartDate = setreviewTradeFull.CouponIncludeStartDate;
|
||
tradeFull.CouponUsePaymentDate = setreviewTradeFull.CouponUsePaymentDate;
|
||
tradeFull.KOObservationDates = setreviewTradeFull.KOObservationDates;
|
||
tradeFull.KOObservationSettleDates = setreviewTradeFull.KOObservationSettleDates;
|
||
break;
|
||
case "亚式期权":
|
||
tradeFull.StrikeGearingFactor = setreviewTradeFull.StrikeGearingFactor;
|
||
break;
|
||
case "累计期权":
|
||
tradeFull.KOObservationDates = setreviewTradeFull.KOObservationDates;
|
||
break;
|
||
case "Risky期权":
|
||
tradeFull.ParticipationRate1 = setreviewTradeFull.ParticipationRate1;
|
||
tradeFull.ParticipationRate2 = setreviewTradeFull.ParticipationRate2;
|
||
tradeFull.ParticipationRate3 = setreviewTradeFull.ParticipationRate3;
|
||
break;
|
||
}
|
||
ViewBag.StructureTypeMap = GetStructureMap(StructureRangeEnum.CUSTOM_TRADE, tradeFull, tradeFull.StructureType);
|
||
tradeFull.MetaDic.TryGetValue(ConsTradeMetaKey.tradeExtendInfo, out var structureType);
|
||
var map = GetStructureMap(StructureRangeEnum.EXTEND_INFO, tradeFull, structureType);
|
||
ViewBag.ExtendInfoMap = new Dictionary<string, List<Structure_Details>>();
|
||
//if (tradeFull.TradeType != "自定义交易" && propertys.Count > 0)
|
||
//{
|
||
// ViewBag.ExtendInfoMap["---"] = propertys.Select(O => new Structure_Details() { ColumnName = O.name, ColumnDefaultValue = O.value }).ToList();
|
||
//}
|
||
foreach (var item in map)
|
||
{
|
||
ViewBag.ExtendInfoMap[item.Key] = item.Value;
|
||
}
|
||
|
||
tradeFull.ExtendInfo = JsonHelper.Serialize(propertys);
|
||
|
||
model.Trade = tradeFull;
|
||
}
|
||
return View("TradeEditV2", model);
|
||
}
|
||
|
||
private Dictionary<string, List<Structure_Details>> GetStructureMap(StructureRangeEnum structureRange, OtcOptionTradeFull trade = null, string StructureType = "")
|
||
{
|
||
//获取自定义结构信息
|
||
var structureTypes =
|
||
new StructureService(CurUser)
|
||
.QueryStructureMap(structureRange);
|
||
var structureTypeMap = new Dictionary<string, List<Structure_Details>>();
|
||
if (structureRange == StructureRangeEnum.BALCK_TRADE)
|
||
{
|
||
structureTypeMap["气囊结构"] = new List<Structure_Details>();
|
||
}
|
||
foreach (var item in structureTypes)
|
||
{
|
||
structureTypeMap[item.Key] = item.Value;
|
||
}
|
||
if (trade != null && !StructureType.IsNullOrWhiteSpace())
|
||
{
|
||
#region 自定义结构
|
||
|
||
if (!structureTypeMap.ContainsKey(StructureType))
|
||
{
|
||
structureTypeMap[StructureType] = new List<Structure_Details>();
|
||
}
|
||
var structureDetails = new List<Structure_Details>(structureTypeMap[StructureType]);
|
||
|
||
structureTypeMap[StructureType].Clear();
|
||
|
||
foreach (var item in trade.Propertys)
|
||
{
|
||
var template =
|
||
structureDetails.FirstOrDefault(O => O.ColumnName == item.name)
|
||
?? new Structure_Details() { ColumnType = StructureColumnTypeEnum.TEXT };
|
||
template.ColumnName = item.name;
|
||
template.ColumnDefaultValue = item.value;
|
||
structureTypeMap[StructureType].Add(template);
|
||
}
|
||
|
||
#endregion
|
||
}
|
||
return structureTypeMap;
|
||
}
|
||
|
||
public JsonResult CheckTradeScale(int? eid, bool isContinue = false)
|
||
{
|
||
try
|
||
{
|
||
var passProcess = new TradeCheckService(CurUser).TradeScaleCheck(eid ?? 0, isContinue);
|
||
if (passProcess)
|
||
{
|
||
if (isContinue)
|
||
{
|
||
return JsonSuccess("投资规模审批已提交至下一流程");
|
||
}
|
||
return JsonSuccess("投资规模审批已通过");
|
||
}
|
||
}
|
||
catch (Exception)
|
||
{
|
||
return JsonSuccess("审批流程最后一步的审批角色对审批簿记的投资规模依然不足!", "无下一步");
|
||
}
|
||
|
||
|
||
return JsonSuccess("目前簿记下投资规模已超过权限,是否提交至下一流程?", "下一步");
|
||
}
|
||
|
||
|
||
[HttpPost]
|
||
public JsonResult SaveGroupTrade(OtcOptionTradeFull trade, int[] tradeIds)
|
||
{
|
||
var groupTrade = new TradeSaveService(CurUser).SaveGroupTrade(trade, tradeIds);
|
||
|
||
return JsonSuccess("保存组合交易成功", groupTrade);
|
||
}
|
||
|
||
[HttpPost]
|
||
public JsonResult CheckTrade(OtcOptionTradeFull trade, string additionalProcessing)
|
||
{
|
||
if (trade == null)
|
||
{
|
||
return JsonError("数据不能为空");
|
||
}
|
||
|
||
if (string.IsNullOrEmpty(trade.EncryptId))
|
||
{
|
||
return JsonError("获取交易ID参数失败!");
|
||
}
|
||
|
||
trade.id = DataProtectHelper.DecryptInt(trade.EncryptId);
|
||
var result = new TradeCheckService(CurUser).TradeCheck(trade, additionalProcessing);
|
||
result.message = result.message.TrimToNull();
|
||
if (result.success)
|
||
{
|
||
return JsonSuccess(result.specialOperateForTrade ? string.Empty : result.message ?? "复核审批成功!", result);
|
||
}
|
||
return JsonError(result.message ?? "交易复核失败!", result);
|
||
}
|
||
|
||
[HttpPost]
|
||
public JsonResult CheckTradeGroup(OtcOptionTradeFull trade)
|
||
{
|
||
if (trade == null)
|
||
{
|
||
return JsonError("数据不能为空");
|
||
}
|
||
|
||
if (string.IsNullOrEmpty(trade.EncryptId))
|
||
{
|
||
return JsonError("获取交易ID参数失败!");
|
||
}
|
||
|
||
trade.id = DataProtectHelper.DecryptInt(trade.EncryptId);
|
||
var result = new TradeCheckService(CurUser).TradeGroupCheck(trade);
|
||
result.message = result.message.TrimToNull();
|
||
if (result.success)
|
||
{
|
||
return JsonSuccess(result.specialOperateForTrade ? string.Empty : result.message ?? "复核审批成功!", result);
|
||
}
|
||
return JsonError(result.message ?? "交易复核失败!", result);
|
||
}
|
||
|
||
|
||
[HttpPost]
|
||
public JsonResult TradeReject(OtcOptionTradeFull req)
|
||
{
|
||
if (req == null)
|
||
{
|
||
return JsonError("数据不能为空");
|
||
}
|
||
|
||
if (req.EncryptId.IsNullOrWhiteSpace())
|
||
{
|
||
return JsonError("拒绝失败!");
|
||
}
|
||
var tdConv = TradeConverter.ConvertOptionTrade(req);
|
||
var id = DataProtectHelper.DecryptInt(req.EncryptId);
|
||
|
||
new TradeRejectService(CurUser).OtcOptionTradeReject(tdConv, id);
|
||
|
||
return JsonSuccess("拒绝成功!");
|
||
}
|
||
|
||
[HttpPost]
|
||
public JsonResult tradeEditJson(trade req)
|
||
{
|
||
if (req == null)
|
||
{
|
||
return JsonError("数据不能为空");
|
||
}
|
||
|
||
if (req.TradeType == "价差期权")
|
||
{
|
||
var errorMsg = SpreadOptionValidator.Validate(req);
|
||
if (!string.IsNullOrEmpty(errorMsg))
|
||
{
|
||
return JsonError(errorMsg);
|
||
}
|
||
}
|
||
|
||
if (req.TradeType == "收益互换")
|
||
{
|
||
var errorMsg = SwapTradeValidator.Validate(req);
|
||
if (!string.IsNullOrEmpty(errorMsg))
|
||
{
|
||
return JsonError(errorMsg);
|
||
}
|
||
}
|
||
|
||
var id = 0;
|
||
if (!string.IsNullOrEmpty(req.EncryptId))
|
||
{
|
||
id = DataProtectHelper.DecryptInt(req.EncryptId);
|
||
}
|
||
|
||
try
|
||
{
|
||
var r = new TradeSaveService(CurUser).SaveTrade(req, TradeSourceEnum.系统交易);
|
||
if (r.TradeType == "合成价差期权")
|
||
{
|
||
r.SyntheticUnderlyingTipsInfo = synthetic_underlyingBLL.GetUnderlyingTipsInfo(r.UnderlyingCode);
|
||
}
|
||
|
||
var vaQuery = from um in db.underlying_manager
|
||
join va in db.variety on um.UnderlyingTypeId equals va.id
|
||
where um.id == r.UnderlyingId
|
||
select new VarietyDto { QuoteUnit = va.QuoteUnit };
|
||
var variety = vaQuery.FirstOrDefault();
|
||
if (variety != null)
|
||
{
|
||
r.QuoteUnit = variety.QuoteUnit;
|
||
r.QuoteUnitSingle = variety.QuoteUnitSingle;
|
||
}
|
||
using (var tagService = new TagService(CurUser))
|
||
{
|
||
tagService.SetTradeTagForTradeEdit(new SetTradeTagForTradeEditRequest
|
||
{
|
||
TradeId = r.id,
|
||
Tags = req.Tags
|
||
});
|
||
}
|
||
return JsonSuccess("更新成功", r);
|
||
}
|
||
catch (Exception e)
|
||
{
|
||
LogFactory.GetLogger("交易保存").Error(e);
|
||
return JsonError("保存失败:" + e.GetBaseException().Message, e.ToJson());
|
||
}
|
||
}
|
||
|
||
[HttpPost]
|
||
public JsonResult InValidTrade(string id)
|
||
{
|
||
var intid = DataProtectHelper.DecryptInt(id);
|
||
new TradeInvalidService(CurUser).InvalidTrade(intid, false);
|
||
return JsonSuccess("操作成功");
|
||
}
|
||
|
||
[MyAuthorize("交易管理-交易导入")]
|
||
public ActionResult tradeUpload()
|
||
{
|
||
return View();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 导入场外期权交易
|
||
/// </summary>
|
||
[MyAuthorize("交易管理-交易导入")]
|
||
public ActionResult UploadOtcTrade()
|
||
{
|
||
var files = Request.Form.Files;
|
||
|
||
if (files == null || files.Count == 0)
|
||
{
|
||
return JsonError("上传文件不存在");
|
||
}
|
||
|
||
var file = files[0];
|
||
|
||
if (!Path.GetExtension(file.FileName).Equals(".xlsx", StringComparison.OrdinalIgnoreCase))
|
||
{
|
||
return JsonError("请上传Excel(.xlsx)格式文件");
|
||
}
|
||
|
||
using var stream = file.OpenReadStream();
|
||
new OtcTradeImportService(CurUser).ImportOptionTradesFromExcel(stream, out var TotalNum, out var SuccessNum);
|
||
|
||
return Json(new
|
||
{
|
||
success = true,
|
||
totalNum = TotalNum,
|
||
successNum = SuccessNum,
|
||
});
|
||
}
|
||
|
||
[MyAuthorize("交易管理-交易导入")]
|
||
public ActionResult UploadStructureTrade(IFormFile file)
|
||
{
|
||
if (Path.GetExtension(file.FileName)?.ToLowerInvariant() != ".csv")
|
||
{
|
||
return Json(new
|
||
{
|
||
success = false,
|
||
jsonrpc = 2.0,
|
||
error = new
|
||
{
|
||
message = "请上传csv格式文件"
|
||
},
|
||
id = "id"
|
||
});
|
||
}
|
||
|
||
using var openStream = file.OpenReadStream();
|
||
var result = new StructureTradeImportService(CurUser).ImportFromCsv(openStream);
|
||
|
||
if (result.IsSuccess)
|
||
{
|
||
return JsonSuccess();
|
||
}
|
||
|
||
return JsonError(result.Message);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 当日成交查询。
|
||
/// 查询在当前交易日成交,或在当前交易日被修改过状态的交易
|
||
/// </summary>
|
||
[HttpPost]
|
||
public JsonResult tradeOnValueDateQuery(TdTradeQueryModel req)
|
||
{
|
||
var stopwatch = new System.Diagnostics.Stopwatch();
|
||
stopwatch.Start(); // 开始监视代码运行时间
|
||
req.AssetIds = AssetUnitModel.IntersectAssetUnits(req.AssetIdGroupList, req.AssetIds).ToList();
|
||
req.UserAssets = CurUser.GetAssetUnitIds();
|
||
req.UserClients = CurUser.GetClientIdsByCurUser(CurUser.交易管理_查看所有交易);
|
||
req.CurUserTradeIds = CurUser.GetTradeIdsByCurUser();
|
||
req.OtcTradeType = OtcTradeType.Options;
|
||
stopwatch.Stop(); // 停止监视
|
||
TimeSpan timespan = stopwatch.Elapsed; // 获取当前实例测量得出的总时间
|
||
double seconds = timespan.TotalSeconds;
|
||
var sList = new TodayTradeQueryService(CurUser).GetConfirmList(req);
|
||
return Json(sList);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 当日成交而几个tab的交易总数。
|
||
/// </summary>
|
||
[HttpPost]
|
||
public JsonResult tradeCountsOnValueDateQuery()
|
||
{
|
||
var userAssets = CurUser.GetAssetUnitIds();
|
||
var userClients = CurUser.GetClientIdsByCurUser(CurUser.交易管理_查看所有交易);
|
||
var sum = new TodayTradeQueryService(CurUser).GetTdTradesCountSum(userAssets, userClients, DBModels.Enums.OtcTradeType.Options);
|
||
var countDic = new Dictionary<int, int> {
|
||
{(int)TradeTabIndexEnum.今日到期,sum.TdExerciseCount },
|
||
{(int)TradeTabIndexEnum.今日终止,sum.TdEarlyStoppedCount },
|
||
{(int)TradeTabIndexEnum.明日到期,sum.TmExerciseCount },
|
||
{(int)TradeTabIndexEnum.今日成交,sum.TdCreatedCount },
|
||
{(int)TradeTabIndexEnum.今日敲出,sum.TdKnockedOutCount },
|
||
};
|
||
return Json(countDic);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 当日敲出查询。
|
||
/// </summary>
|
||
[HttpPost]
|
||
public JsonResult tradeKnockedOutQuery(TdTradeQueryModel req)
|
||
{
|
||
req.AssetIds = AssetUnitModel.IntersectAssetUnits(req.AssetIdGroupList, req.AssetIds).ToList();
|
||
req.UserAssets = CurUser.GetAssetUnitIds();
|
||
req.UserClients = CurUser.GetClientIdsByCurUser(CurUser.交易管理_查看所有交易);
|
||
req.LoginUserId = CurUser.UserId;
|
||
req.CurUserTradeIds = CurUser.GetTradeIdsByCurUser();
|
||
var sList = new TodayTradeQueryService(CurUser).GetKnockedOutList(req);
|
||
return Json(sList);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 提前终止报告列表
|
||
/// 根据tradeCash.ExerciseWay == TradeCashExerciseWayEnum.提前终止行权做验证
|
||
/// </summary>
|
||
[HttpPost]
|
||
public JsonResult endTradeOnValueDateQuery(TradeReq req)
|
||
{
|
||
req.LoginUserId = CurUser.UserId;
|
||
req.OptDateStart = valuedateBLL.ValueDate;
|
||
req.OptDateEnd = valuedateBLL.ValueDate;
|
||
if (!string.IsNullOrWhiteSpace(req.TradeStatus))
|
||
{
|
||
req.TradeStatusList = req.TradeStatus.Split(new[] { ',' }).ToList();
|
||
}
|
||
req.AssetIdList = AssetUnitModel.IntersectAssetUnits(req.AssetIdGroupList, req.AssetIdList).ToList();
|
||
req.UserAssets = CurUser.GetAssetUnitIds();
|
||
req.UserClients = CurUser.GetClientIdsByCurUser(CurUser.交易管理_查看所有交易);
|
||
req.CurUserTradeIds = CurUser.GetTradeIdsByCurUser();
|
||
var sList = new tradeBLL().SearchTerminationTradeWithCashList(req, out var gsum);
|
||
foreach (var r in sList.rows)
|
||
{
|
||
if (r.trade.TradeType == "合成价差期权")
|
||
{
|
||
r.trade.SyntheticUnderlyingTipsInfo = synthetic_underlyingBLL.GetUnderlyingTipsInfo(r.trade.UnderlyingCode);
|
||
}
|
||
}
|
||
|
||
return Json(sList);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 交易观察状态列表
|
||
/// 障碍期权,双鲨期权,凤凰期权,雪球期权,累计期权分tab展示
|
||
/// </summary>
|
||
[HttpPost]
|
||
public JsonResult tradeObservationStatusQuery(TdTradeQueryModel req)
|
||
{
|
||
req.UserAssets = CurUser.GetAssetUnitIds();
|
||
req.UserClients = CurUser.GetClientIdsByCurUser(CurUser.交易管理_查看所有交易);
|
||
req.LoginUserId = CurUser.UserId;
|
||
req.CurUserTradeIds = CurUser.GetTradeIdsByCurUser();
|
||
var sList = new TodayTradeQueryService(CurUser).GetObservationStatusTradeList(req);
|
||
|
||
return Json(sList);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 用作需要发送交易确认书的交易列表查询,将对冲交易过滤掉
|
||
/// </summary>
|
||
[HttpPost]
|
||
public JsonResult tradeConfirmEmailQuery(TradeReq req)
|
||
{
|
||
req.AssetIdList = AssetUnitModel.IntersectAssetUnits(req.AssetIdGroupList, req.AssetIdList).ToList();
|
||
req.UserAssets = CurUser.GetAssetUnitIds();
|
||
req.UserClients = CurUser.GetClientIdsByCurUser(CurUser.交易管理_查看所有交易);
|
||
req.CurUserTradeIds = CurUser.GetTradeIdsByCurUser();
|
||
var sList = new tradeBLL().SearchListForTradeConfirm(req);
|
||
var rowList = sList.rows;
|
||
//new TradeDalService(CurUser).SetStructureInfo(rowList);
|
||
//增加交易确认书编号
|
||
if (rowList != null && rowList.Any())
|
||
{
|
||
var tradeIds = rowList.Select(x => x.id).ToList();
|
||
var tradeContractCodeList = (from tradeContractR in db.trade_contract_r
|
||
join tradeContractDoc in (from tradeContractDocTemp in db.trade_contract_document where ContractTypeEnum.Trade == tradeContractDocTemp.Type select tradeContractDocTemp)
|
||
on tradeContractR.ContractCode equals tradeContractDoc.Code into tradeContractDoc1
|
||
from tradeContractDoc2 in tradeContractDoc1.DefaultIfEmpty()
|
||
where tradeIds.Contains(tradeContractR.TradeId) && ContractTypeEnum.Trade == tradeContractR.Type && tradeContractR.Type == tradeContractDoc2.Type && tradeContractR.IsValid
|
||
select new
|
||
{
|
||
tradeContractR.id,
|
||
tradeContractR.TradeId,
|
||
tradeContractR.ContractCode,
|
||
tradeContractR.send_email_result,
|
||
tradeContractDoc = tradeContractDoc2
|
||
}).ToList();
|
||
|
||
foreach (var trade in rowList)
|
||
{
|
||
|
||
if (trade.TradeType == "合成价差期权")
|
||
{
|
||
trade.SyntheticUnderlyingTipsInfo = synthetic_underlyingBLL.GetUnderlyingTipsInfo(trade.UnderlyingCode);
|
||
}
|
||
var tradeContractinfo = tradeContractCodeList.FirstOrDefault(t => t.TradeId == trade.id);
|
||
trade.MetaDic["send_email_result"] = "";
|
||
if (tradeContractinfo != null)
|
||
{
|
||
trade.ContractCode = tradeContractinfo.ContractCode;
|
||
if (null != tradeContractinfo.tradeContractDoc)
|
||
{
|
||
trade.MetaDic["ContractEncryptId"] = tradeContractinfo.tradeContractDoc.EncryptId;
|
||
trade.MetaDic["ContractRId"] = tradeContractinfo.id.ToString();
|
||
trade.MetaDic["ContractDocUrl"] = tradeContractinfo.tradeContractDoc.RelativePath;
|
||
trade.MetaDic["ContractStatus"] = tradeContractinfo.tradeContractDoc.Status;
|
||
trade.MetaDic["StampDocumentFileName"] = tradeContractinfo.tradeContractDoc.StampDocumentFileName;
|
||
trade.MetaDic["HasGeneratedConfirmBook"] = trade.HasGeneratedConfirmBook() ? "'True'" : null;
|
||
|
||
trade.MetaDic["ConfirmBookOptName"] = tradeContractinfo.tradeContractDoc.OptName;
|
||
|
||
trade.MetaDic["ConfirmBookOptDate"] = tradeContractinfo.tradeContractDoc.OptDate.Value.ToString("yyyy-MM-dd HH:mm:ss");
|
||
|
||
if (tradeContractinfo.tradeContractDoc.SealResult != null)
|
||
{
|
||
trade.MetaDic["SealResult"] = Enum.GetName(typeof(SealResultEnum), tradeContractinfo.tradeContractDoc.SealResult);
|
||
}
|
||
else
|
||
{
|
||
trade.MetaDic["SealResult"] = "";
|
||
}
|
||
|
||
|
||
trade.MetaDic["SealTime"] = tradeContractinfo.tradeContractDoc.SealResult == (int)SealResultEnum.成功 ? tradeContractinfo.tradeContractDoc.OptDate.Value.ToString("yyyy-MM-dd HH:mm:ss") : "";
|
||
|
||
|
||
//if (!PS.Config.Is海通 && !PS.Config.Is宏源)
|
||
//{
|
||
// var pdfPath = Path.ChangeExtension(tradeContractinfo.tradeContractDoc.AbsolutePath, "pdf");
|
||
// if (System.IO.File.Exists(pdfPath))
|
||
// {
|
||
// trade.MetaDic["ContractDocUrl"] = Path.ChangeExtension((trade.MetaDic["ContractDocUrl"] ?? ""), "pdf");
|
||
// }
|
||
//}
|
||
trade.MetaDic["send_email_result"] = string.IsNullOrEmpty(tradeContractinfo.send_email_result) ? "未发送" : tradeContractinfo.send_email_result;
|
||
}
|
||
}
|
||
if (PS.Config.Is物产中大)
|
||
{
|
||
trade.ContractCode = db.trade_contract_r_number.Where(n => n.TradeConfirmNumberType == "C" && n.TradeId == trade.id).FirstOrDefault()?.TradeConfirmNumber;
|
||
}
|
||
|
||
|
||
}
|
||
}
|
||
return Json(sList);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 用作需要发送交易确认书的交易列表查询,将对冲交易过滤掉
|
||
/// </summary>
|
||
[HttpPost]
|
||
public JsonResult ExchangeTradeConfirmEmailQuery(TradeReq req)
|
||
{
|
||
req.AssetIdList = AssetUnitModel.IntersectAssetUnits(req.AssetIdGroupList, req.AssetIdList).ToList();
|
||
req.UserAssets = CurUser.GetAssetUnitIds();
|
||
req.UserClients = CurUser.GetClientIdsByCurUser(CurUser.交易管理_查看所有交易);
|
||
req.CurUserTradeIds = CurUser.GetTradeIdsByCurUser();
|
||
var sList = new tradeBLL().SearchListForTradeConfirm(req);
|
||
var rowList = sList.rows;
|
||
//new TradeDalService(CurUser).SetStructureInfo(rowList);
|
||
//增加交易确认书编号
|
||
if (rowList != null && rowList.Any())
|
||
{
|
||
var tradeIds = rowList.Select(x => x.id).ToList();
|
||
var tradeContractCodeList = (from tradeContractR in db.trade_contract_r
|
||
join tradeContractDoc in (from tradeContractDocTemp in db.trade_contract_document where ContractTypeEnum.Trade == tradeContractDocTemp.Type select tradeContractDocTemp)
|
||
on tradeContractR.ContractCode equals tradeContractDoc.Code into tradeContractDoc1
|
||
from tradeContractDoc2 in tradeContractDoc1.DefaultIfEmpty()
|
||
where tradeIds.Contains(tradeContractR.TradeId) && ContractTypeEnum.Trade == tradeContractR.Type && tradeContractR.Type == tradeContractDoc2.Type && tradeContractR.IsValid
|
||
select new
|
||
{
|
||
tradeContractR.id,
|
||
tradeContractR.TradeId,
|
||
tradeContractR.ContractCode,
|
||
tradeContractDoc = tradeContractDoc2
|
||
}).ToList();
|
||
foreach (var trade in rowList)
|
||
{
|
||
if (trade.TradeType == "合成价差期权")
|
||
{
|
||
trade.SyntheticUnderlyingTipsInfo = synthetic_underlyingBLL.GetUnderlyingTipsInfo(trade.UnderlyingCode);
|
||
}
|
||
var tradeContractinfo = tradeContractCodeList.FirstOrDefault(t => t.TradeId == trade.id);
|
||
if (tradeContractinfo != null)
|
||
{
|
||
trade.ContractCode = tradeContractinfo.ContractCode;
|
||
if (null != tradeContractinfo.tradeContractDoc)
|
||
{
|
||
trade.MetaDic["ContractEncryptId"] = tradeContractinfo.tradeContractDoc.EncryptId;
|
||
trade.MetaDic["ContractRId"] = tradeContractinfo.id.ToString();
|
||
trade.MetaDic["ContractDocUrl"] = tradeContractinfo.tradeContractDoc.RelativePath;
|
||
trade.MetaDic["ContractStatus"] = tradeContractinfo.tradeContractDoc.Status;
|
||
trade.MetaDic["StampDocumentFileName"] = tradeContractinfo.tradeContractDoc.StampDocumentFileName;
|
||
trade.MetaDic["HasGeneratedConfirmBook"] = trade.HasGeneratedConfirmBook() ? "'True'" : null;
|
||
if (!PS.Config.Is海通 && !PS.Config.Is宏源)
|
||
{
|
||
var pdfPath = Path.ChangeExtension(tradeContractinfo.tradeContractDoc.AbsolutePath, "pdf");
|
||
if (System.IO.File.Exists(pdfPath))
|
||
{
|
||
trade.MetaDic["ContractDocUrl"] = Path.ChangeExtension((trade.MetaDic["ContractDocUrl"] ?? ""), "pdf");
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return Json(sList);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 用作需要发送互换确认书的交易列表查询,将对冲交易过滤掉
|
||
/// </summary>
|
||
[HttpPost]
|
||
public JsonResult ExchangeConfirmQuery(TradeReq req)
|
||
{
|
||
req.sidx = "t.id";
|
||
req.sord = "desc";
|
||
|
||
var tradelist = new List<trade>();
|
||
|
||
string[] tradeTypes = null;
|
||
switch (req.TabIndex)
|
||
{
|
||
case 2:
|
||
tradeTypes = ConsTrade.AllTradeTypes.Except(ConsTrade.TradeTypesForHedge).Except(new[] { "收益互换" }).ToArray();
|
||
break;
|
||
case 1:
|
||
default:
|
||
tradeTypes = new[] { "收益互换" };
|
||
break;
|
||
}
|
||
|
||
var idquery = from tc in db.trade_cash
|
||
join t in db.trade
|
||
on tc.TradeId equals t.id
|
||
where t.TradeType == "累计期权"
|
||
&& t.ValidState != ConsGlobal.InValid
|
||
&& ConsTrade.TradeCompleteStatus.Contains(t.TradeStatus)
|
||
&& tc.Action != "系统操作-期权费"
|
||
&& tc.ValidState != ConsGlobal.InValid
|
||
&& tc.IsDeleted != true
|
||
group tc by tc.TradeId into g
|
||
select new
|
||
{
|
||
Key = g.Key,
|
||
list = g.ToList()
|
||
};
|
||
var ids = idquery.ToList().Select(x => x.list.OrderByDescending(i => i.ValueDate).FirstOrDefault()).Where(t => t.ValueDate >= req.TradeDateStart
|
||
&& t.ValueDate <= req.TradeDateEnd).Select(x => x.id).ToList();
|
||
|
||
var tid2 = db.trade.Where(x => x.TradeType == "累计期权" && x.ValidState != ConsGlobal.InValid && x.TradeDate >= req.TradeDateStart && x.TradeDate <= req.TradeDateEnd).Select(x => x.id).ToList();
|
||
var tcid2 = db.trade_cash.Where(x => x.Action == "系统操作-期权费" && x.ValidState != ConsGlobal.InValid
|
||
&& x.IsDeleted != true && tid2.Contains(x.TradeId)).AsEnumerable().GroupBy(x => x.TradeId).Select(x => x.FirstOrDefault().id).ToList();
|
||
|
||
var tcid = ids.Union(tcid2);
|
||
|
||
var query1 = (from tc in db.trade_cash
|
||
join t in db.trade
|
||
on tc.TradeId equals t.id
|
||
join tr in db.trade_contract_r.Where(O => O.IsValid)
|
||
on tc.id equals tr.TradeCashId into tempTr
|
||
from tr in tempTr.DefaultIfEmpty()
|
||
join td in db.trade_contract_document
|
||
on tr.ContractCode equals td.Code into tempTd
|
||
from td in tempTd.DefaultIfEmpty()
|
||
where
|
||
tradeTypes.Contains(t.TradeType)
|
||
&& tcid.Contains(tc.id)
|
||
select new
|
||
{
|
||
t,
|
||
tc,
|
||
td,
|
||
ContractCode = tr == null ? "" : tr.ContractCode,
|
||
});
|
||
|
||
var query2 = (from tc in db.trade_cash
|
||
join t in db.trade
|
||
on tc.TradeId equals t.id
|
||
join tr in db.trade_contract_r.Where(O => O.IsValid)
|
||
on tc.id equals tr.TradeCashId into tempTr
|
||
from tr in tempTr.DefaultIfEmpty()
|
||
join td in db.trade_contract_document
|
||
on tr.ContractCode equals td.Code into tempTd
|
||
from td in tempTd.DefaultIfEmpty()
|
||
where
|
||
t.ValidState != ConsGlobal.InValid
|
||
&& tradeTypes.Contains(t.TradeType)
|
||
&& tc.ValidState != ConsGlobal.InValid
|
||
&& tc.IsDeleted != true
|
||
&& t.TradeType != "累计期权"
|
||
&& tc.ValueDate >= req.TradeDateStart
|
||
&& tc.ValueDate <= req.TradeDateEnd
|
||
select new
|
||
{
|
||
t,
|
||
tc,
|
||
td,
|
||
ContractCode = tr == null ? "" : tr.ContractCode,
|
||
});
|
||
|
||
var query = query1.Union(query2);
|
||
|
||
if (!string.IsNullOrWhiteSpace(req.ClientIds))
|
||
{
|
||
query = query.Where(O => req.ClientIdsInt.Contains(O.t.ClientId));
|
||
}
|
||
if (!string.IsNullOrWhiteSpace(req.TradeNumber))
|
||
{
|
||
query = query.Where(O => O.t.TradeNumber == req.TradeNumber);
|
||
}
|
||
|
||
if (!string.IsNullOrWhiteSpace(req.ContractCode))
|
||
{
|
||
query = query.Where(O => O.ContractCode == req.ContractCode);
|
||
}
|
||
|
||
if (req.SealResults != null)
|
||
{
|
||
if (req.SealResults.Contains(2))
|
||
{
|
||
query = query.Where(t => req.SealResults.Contains((int)t.td.SealResult) || t.td.SealResult == null);
|
||
}
|
||
else
|
||
{
|
||
query = query.Where(t => req.SealResults.Contains((int)t.td.SealResult));
|
||
}
|
||
|
||
}
|
||
|
||
|
||
if (req.SealDateStart != null)
|
||
{
|
||
query = query.Where(t => t.td.SealResult == (int)SealResultEnum.成功 && t.td.OptDate != null && t.td.OptDate >= req.SealDateStart);
|
||
}
|
||
|
||
if (req.SealDateEnd != null)
|
||
{
|
||
var dateTemp = req.SealDateEnd.Value.AddDays(1);
|
||
query = query.Where(t => t.td.SealResult == (int)SealResultEnum.成功 && t.td.OptDate != null && t.td.OptDate < dateTemp);
|
||
}
|
||
|
||
|
||
var sList = query.ToSearchList(req);
|
||
|
||
tradelist = sList.rows.Select(O =>
|
||
{
|
||
var sealResult = O.td?.SealResult;
|
||
O.t.trade_cash = O.tc.Clone();
|
||
O.t.ContractCode = O.ContractCode;
|
||
O.t.MetaDic = new Dictionary<string, string>() {
|
||
{ "ContractDocUrl" ,O.td?.RelativePath },
|
||
{ "ConfirmBookOptName",O.td?.OptName },
|
||
{ "ConfirmBookOptDate",O.td?.OptDate.OtcFormatDate()},
|
||
{ "SealResult",sealResult != null ? Enum.GetName(typeof(SealResultEnum), sealResult) : ""},
|
||
{ "SealTime",O.td?.SealResult == (int)SealResultEnum.成功 ? O.td?.OptDate.Value.ToString() : ""}
|
||
};
|
||
return O.t.Clone();
|
||
}).ToList();
|
||
|
||
//增加交易确认书编号
|
||
if (tradelist != null && tradelist.Any())
|
||
{
|
||
tradeBLL.SetFieldsByTradeType(tradelist);
|
||
foreach (var trade in tradelist)
|
||
{
|
||
if (trade != null)
|
||
{
|
||
//改成客户方向 只有中粮用
|
||
trade.TradePrice = trade.TradePrice * ((trade.BuySell == "卖出" || trade.TradeType == "远期") ? -1 : 1);
|
||
trade.BuySell = trade.BuySell == "买入" ? "卖出" : "买入";
|
||
//var tcItem = trade.trade_cash ?? null;
|
||
if (trade.trade_cash != null)
|
||
{
|
||
if (trade.TradeType == "收益互换")
|
||
{
|
||
var tip =
|
||
trade.trade_cash.Action == "系统操作-期权费" ?
|
||
(trade.trade_swap.IsPayFloatingProfit && trade.trade_swap.PayLongShort == "多头") ? "买入开仓" : "卖出开仓"
|
||
: (trade.trade_swap.IsPayFloatingProfit && trade.trade_swap.PayLongShort == "多头") ? "卖出平仓" : "买入平仓";
|
||
|
||
trade.MetaDic["TradeTip"] = tip;
|
||
}
|
||
else if (trade.TradeType == "累计期权" && trade.trade_cash.Action != "系统操作-期权费")
|
||
{
|
||
trade.trade_cash.UnwindNotional = trade.OriginalNotional;
|
||
trade.MetaDic["FinalPrice"] = Math.Abs(trade.trade_cash.FinalPrice ?? trade.trade_cash.UnwindPrice ?? 0).ToString();
|
||
var amount = db.trade_cash.Where(x => x.Action != "系统操作-期权费" && x.ValidState != ConsGlobal.InValid
|
||
&& x.IsDeleted != true && trade.id == x.TradeId).Sum(x => x.Amount);
|
||
//客户方向
|
||
trade.MetaDic["Amount"] = (amount * (-1)).ToString();
|
||
}
|
||
else
|
||
{
|
||
trade.MetaDic["FinalPrice"] = Math.Abs(trade.trade_cash.FinalPrice ?? trade.trade_cash.UnwindPrice ?? 0).ToString();
|
||
//客户方向
|
||
trade.MetaDic["Amount"] = (trade.trade_cash.Amount * (-1)).ToString();
|
||
}
|
||
}
|
||
}
|
||
|
||
if (trade.TradeType == "合成价差期权")
|
||
{
|
||
trade.SyntheticUnderlyingTipsInfo = synthetic_underlyingBLL.GetUnderlyingTipsInfo(trade.UnderlyingCode);
|
||
}
|
||
}
|
||
}
|
||
|
||
return Json(new SearchListResult<trade>(sList, tradelist));
|
||
}
|
||
|
||
|
||
|
||
public JsonResult GetTradeMeta(int tradeId, string key)
|
||
{
|
||
if (string.IsNullOrWhiteSpace(key))
|
||
{
|
||
throw new ArgumentNullException(nameof(key));
|
||
}
|
||
var value = new TradeMetaService(CurUser).GetTradeMeta(tradeId, key);
|
||
|
||
return Json(value ?? "");
|
||
}
|
||
|
||
public JsonResult SetTradeMeta(int tradeId, string key, string value)
|
||
{
|
||
if (!db.trade.Any(O => O.id == tradeId)
|
||
|| string.IsNullOrWhiteSpace(key) || key.Length > 30
|
||
|| value == null || value?.Length > 1000)
|
||
{
|
||
throw new Exception("参数不合法");
|
||
}
|
||
var t = db.trade.Find(tradeId);
|
||
var ids = db.trade.Where(m => m.id == t.id || (m.ParentTradeId > 0 && m.ParentTradeId == t.ParentTradeId) || m.id == t.ParentTradeId).Select(m => m.id).ToList();
|
||
foreach (var i in ids)
|
||
{
|
||
new TradeMetaService(CurUser).AddTradeMeta(i, key, value);
|
||
}
|
||
return Json("OK");
|
||
}
|
||
|
||
public trade_cash setTradeUnwind(trade td, underlying_manager um)
|
||
{
|
||
if (td.TradeType == "现金流交易")
|
||
{
|
||
var r = new trade_cash
|
||
{
|
||
TradeId = td.id,
|
||
FinalPrice = 0,
|
||
ExceciseType = "现金",
|
||
CallPut = td.CallPut,
|
||
Strike = 0,
|
||
Notional = 0,
|
||
UnwindType = "全部平仓",
|
||
UnwindNotional = 0,
|
||
UnwindPercentRate = td.StockEqvNotional / td.OriginalStockEqvNotional,
|
||
Amount = 0,
|
||
ValueDate = valuedateBLL.ValueDate <= td.ExerciseDate.Value || td.SettlementFlag == 1 ? valuedateBLL.ValueDate : td.ExerciseDate.Value
|
||
};
|
||
r.TradeAmount = 0;
|
||
r.UnwindTradeAmount = 0;
|
||
return r;
|
||
}
|
||
else
|
||
{
|
||
var r = new trade_cash
|
||
{
|
||
TradeId = td.id,
|
||
FinalPrice = um.UnderlyingType == "组合标的" ? new SyntheticUnderlyingPriceService(CurUser).GetPrice(td.UnderlyingCode) : (um.Price ?? 0),
|
||
ExceciseType = "现金",
|
||
CallPut = td.CallPut,
|
||
Strike = td.IsMoneynessOptionData ? (td.Strike * td.SpotPrice) : td.Strike,
|
||
Notional = td.Notional,
|
||
UnwindType = "全部平仓",
|
||
UnwindNotional = td.Notional,
|
||
UnwindPercentRate = td.StockEqvNotional / td.OriginalStockEqvNotional,
|
||
UnwindStockEqvNotional = td.StockEqvNotional,
|
||
Amount = 0,
|
||
ValueDate = valuedateBLL.ValueDate <= td.ExerciseDate.Value || td.SettlementFlag == 1 ? valuedateBLL.ValueDate : td.ExerciseDate.Value
|
||
};
|
||
|
||
//累计期权平仓日不可以跳过还未观察的观察日
|
||
if (td.TradeType == "累计期权")
|
||
{
|
||
var obervations = db.autocall_observation.Where(x => x.TradeId == td.id);
|
||
if (obervations.Any())
|
||
{
|
||
var lastObservationDate = obervations.Max(x => x.EndDate);
|
||
if (string.IsNullOrEmpty(td.trade_accumulator_option.KOObservationDates))
|
||
{
|
||
if (lastObservationDate < valuedateBLL.ValueDate)
|
||
{
|
||
r.ValueDate = lastObservationDate.AddDays(1);
|
||
}
|
||
else
|
||
{
|
||
r.ValueDate = lastObservationDate;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
var observationDates = QdpHelper.ParseObservationDate(td.trade_accumulator_option.KOObservationDates);
|
||
var latestObservationDate = observationDates.Where(x => x.DateTime > lastObservationDate).Min(x => x);
|
||
if (latestObservationDate.DateTime < valuedateBLL.ValueDate)
|
||
{
|
||
r.ValueDate = latestObservationDate.DateTime;
|
||
}
|
||
else
|
||
{
|
||
r.ValueDate = valuedateBLL.ValueDate;
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
r.ValueDate = td.TradeDate.Value;
|
||
}
|
||
}
|
||
r.TradeAmount = r.Notional / um.CountRatio;
|
||
r.UnwindTradeAmount = r.UnwindNotional / um.CountRatio;
|
||
return r;
|
||
}
|
||
}
|
||
|
||
public ActionResult tradeUnwind(string enid, bool isUseApproval = false)
|
||
{
|
||
var intid = DataProtectHelper.DecryptInt(enid);
|
||
var td = db.trade.Find(intid);
|
||
if (td == null)
|
||
{
|
||
return Content("找不到现金交割交易");
|
||
}
|
||
tradeBLL.SetFieldsByTradeType(td);
|
||
var r = new trade_cash();
|
||
|
||
var um = DataCacheProvider.GetUnderlyingDataSource().GetData(td.UnderlyingCode);
|
||
var variety = um == null ? null : VarietyBLL.GetAllvarietyModel().FirstOrDefault(v => v.id == um.UnderlyingTypeId);
|
||
var hasProcess = HasTradeProcess();
|
||
if (((valuedateBLL.SystemDate.CloseReCheck == 1) || (valuedateBLL.SystemDate.CloseReApprove == 1 && hasProcess)) && td.TradeStatus == ConsTrade.平仓待复核)
|
||
{
|
||
r = db.trade_cash.FirstOrDefault(t => t.TradeId == intid && t.Action == ClientCashInCashOut.系统操作_平仓费 && t.ValidState == ConsGlobal.InValid && !t.IsDeleted);
|
||
if (r == null)
|
||
{
|
||
return Content("该笔交易状态为平仓待复核,而trade_cash表没有相关记录,请检查该笔交易是否有效");
|
||
}
|
||
if (td.Warning)
|
||
{
|
||
new TradeDalService(CurUser).RollbackToBeforeSettle(td, r.ValueDate);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (td.Warning)
|
||
{
|
||
var valueDate = valuedateBLL.ValueDate <= td.ExerciseDate.Value ? valuedateBLL.ValueDate : td.ExerciseDate.Value;
|
||
new TradeDalService(CurUser).RollbackToBeforeSettle(td, valueDate);
|
||
}
|
||
r = setTradeUnwind(td, um);
|
||
}
|
||
//r.StockEqvNotional = TradeHelper.GetStockEqvNotionalReal(td.StockEqvNotional, td.ParticipationRate, td.AnnualizeFactor);
|
||
r.StockEqvNotional = td.StockEqvNotional;
|
||
r.OriginalStockEqvNotional = td.OriginalStockEqvNotional ?? 0;
|
||
r.IsUsePremiumRate = td.IsUsePremiumRate;
|
||
r.IsTradePricePayType = td.IsTradePricePayType;
|
||
r.InitialSpotPrice = td.SpotPrice ?? 0;
|
||
r.OriginalNotional = td.OriginalNotional;
|
||
r.TradeOriginalAmount = td.OriginalNotional / um?.CountRatio;
|
||
r.UnderlyingCode = td.UnderlyingCode;
|
||
r.UnderlyingId = um?.id;
|
||
r.UnderlyingInstrumentType = td.UnderlyingInstrumentType;
|
||
r.TradeType = BuySellConvert.GetClientBuySell(td.BuySell);
|
||
r.BondType = td.TradeType;
|
||
r.ParticipationRate = td.ParticipationRate;
|
||
r.PrincipalSum = td.PrincipalSum();
|
||
r.OriginalPrincipalSum = td.OriginalPrincipalSum;
|
||
r.AnnualizeFactor = td.AnnualizeFactor;
|
||
r.Trade_TradeType = td.TradeType;
|
||
if (!isUseApproval)
|
||
{
|
||
r.UnwindStockEqvNotional = r.StockEqvNotional;
|
||
r.IsUnwindStockEqvNotional = false;
|
||
r.UnwindPercentRate *= 100;
|
||
}
|
||
else
|
||
{
|
||
bool ActualHasMinusValueOptions = valuedateBLL.SystemDate.UnwindSinglePriceAngle == 1 ? ConsTrade.HasMinusValueOptions.Contains(td.TradeType) : !ConsTrade.HasMinusValueOptions.Contains(td.TradeType);
|
||
|
||
r.SinglePV = r.UnwindPrice * (!ConsTrade.HasMinusValueOptions.Contains(td.TradeType) ? 1 : EodOperationBase.GetSign(td.BuySell));
|
||
r.SinglePVPercentRate = r.UnwindPricePercentRate * (!ConsTrade.HasMinusValueOptions.Contains(td.TradeType) ? 1 : EodOperationBase.GetSign(td.BuySell));
|
||
|
||
r.UnwindPrice = ActualHasMinusValueOptions ? r.UnwindPrice : r.UnwindPrice * (td.BuySell == "买入" ? 1 : -1);
|
||
r.UnwindPricePercentRate = ActualHasMinusValueOptions ? r.UnwindPricePercentRate : r.UnwindPricePercentRate * (td.BuySell == "买入" ? 1 : -1);
|
||
r.Amount = r.Amount * (valuedateBLL.SystemDate.UnwindAmountAngle == 1 || td.TradeType == "收益互换" ? 1 : EodOperationBase.GetSign(td.BuySell));
|
||
r.QuoteAmount = r.QuoteAmount * (valuedateBLL.SystemDate.UnwindAmountAngle == 1 || td.TradeType == "收益互换" ? 1 : EodOperationBase.GetSign(td.BuySell));
|
||
|
||
|
||
r.UnwindPercentRate *= 100;
|
||
r.UnwindPricePercentRate *= 100;
|
||
r.SinglePVPercentRate *= 100;
|
||
}
|
||
|
||
if (r.UnwindVol == null)
|
||
{
|
||
if (YLErp.PS.Config.IsTradeVol)
|
||
{
|
||
r.UnwindVol = new VolatilityService(CurUser).GetTradeVol(td, r.ValueDate);
|
||
}
|
||
else
|
||
{
|
||
var singleVol = new SingleVolReq()
|
||
{
|
||
VolType = "交易",
|
||
Strike = td.Strike ?? 0,
|
||
SpotPrice = r.FinalPrice ?? 0,
|
||
TradeDate = r.ValueDate,
|
||
ExerciseDate = td.ExerciseDate ?? DateTime.Today,
|
||
IsMoneynessOption = td.IsMoneynessOption,
|
||
CallPut = r.CallPut == "看涨" ? "Call" : "Put",
|
||
UnderlyingId = um == null ? 0 : um.id,
|
||
UnderlyingCode = um == null ? "" : um.UnderlyingCode,
|
||
UnderlyingName = um == null ? "" : um.UnderlyingName,
|
||
UnderlyingTypeId = um == null ? 0 : um.UnderlyingTypeId,
|
||
BaseVol = null,
|
||
BidVar = null,
|
||
AskVar = null,
|
||
};
|
||
if (td.TradeType != "现金流交易")
|
||
{
|
||
r.UnwindVol = SingleVolService.GetSingleVol(singleVol, UserId);
|
||
}
|
||
}
|
||
}
|
||
var ExerciseDate = td.ExerciseDate ?? DateTime.Today;
|
||
if (PS.Config.Is厦门象屿 && td.SettlementType == SettlementTypeEnum.ReferencePrice)
|
||
{
|
||
td.TTMDays = TradeCalcHelper.CalculateTTMDaysForXiangYu(r.ValueDate, ExerciseDate, variety?.id ?? 0
|
||
, PS.Config.ErpElement.PrecisionOfMinuteInQuote || ExerciseDate == valuedateBLL.ValueDate);
|
||
}
|
||
else
|
||
{
|
||
td.TTMDays = TradeCalcHelper.CalculateTTMDays(PS.Config.Is润和 ? DateTime.Today : r.ValueDate, ExerciseDate, variety?.id ?? 0
|
||
, PS.Config.ErpElement.PrecisionOfMinuteInQuote || ExerciseDate == valuedateBLL.ValueDate);
|
||
}
|
||
|
||
var tc = new TradeCashService(CurUser).GetLastSettleInfo(intid);
|
||
if (tc != null)
|
||
{
|
||
td.UnWindDate = tc.ValueDate;
|
||
}
|
||
ViewBag.trade = td;
|
||
if (!string.IsNullOrEmpty(td.PairTrade))
|
||
{
|
||
var pid = Convert.ToInt32(td.PairTrade);
|
||
ViewBag.PairTrade = db.trade.Find(pid);
|
||
}
|
||
ViewBag.underlying = um;
|
||
ViewBag.variety = variety;
|
||
|
||
//需要审批或者复核的交易都会显示行权审核提交按钮
|
||
ViewBag.IsShowReCheckClose = ((valuedateBLL.SystemDate.CloseReCheck == 1) || (valuedateBLL.SystemDate.CloseReApprove == 1 && hasProcess)) && td.TradeStatus != ConsTrade.平仓待复核;
|
||
ViewBag.isUseApproval = isUseApproval;
|
||
|
||
return View(r);
|
||
}
|
||
public ActionResult tradeCustomizedUnwind(string enid, bool isUseApproval = false)
|
||
{
|
||
var intid = DataProtectHelper.DecryptInt(enid);
|
||
var td = db.trade.Find(intid);
|
||
if (td.Warning)
|
||
{
|
||
new TradeDalService(CurUser).RollbackToBeforeSettle(td, valuedateBLL.ValueDate);
|
||
}
|
||
var r = new trade_cash();
|
||
if (td == null)
|
||
{
|
||
return Content("找不到现金交割交易");
|
||
}
|
||
|
||
var um = DataCacheProvider.GetUnderlyingDataSource().GetData(td.UnderlyingCode);
|
||
var variety = VarietyBLL.GetAllvarietyModel().FirstOrDefault(v => v.id == um.UnderlyingTypeId);
|
||
|
||
var hasProcess = HasTradeProcess();
|
||
if (((valuedateBLL.SystemDate.CloseReCheck == 1) || (valuedateBLL.SystemDate.CloseReApprove == 1 && hasProcess)) && td.TradeStatus == ConsTrade.平仓待复核)
|
||
{
|
||
r = db.trade_cash.FirstOrDefault(t => t.TradeId == intid && t.Action == ClientCashInCashOut.系统操作_平仓费 && t.ValidState == ConsGlobal.InValid && !t.IsDeleted);
|
||
if (r == null)
|
||
{
|
||
return Content("该笔交易状态为平仓待复核,而trade_cash表没有相关记录,请检查该笔交易是否有效");
|
||
}
|
||
}
|
||
else
|
||
{
|
||
r = setTradeUnwind(td, um);
|
||
}
|
||
|
||
r.StockEqvNotional = td.StockEqvNotional;
|
||
r.OriginalStockEqvNotional = td.OriginalStockEqvNotional ?? 0;
|
||
r.IsUsePremiumRate = td.IsUsePremiumRate;
|
||
r.IsTradePricePayType = td.IsTradePricePayType;
|
||
r.InitialSpotPrice = td.SpotPrice ?? 0;
|
||
r.TradeOriginalAmount = td.OriginalNotional / um.CountRatio;
|
||
r.OriginalNotional = td.OriginalNotional;
|
||
r.UnderlyingCode = td.UnderlyingCode;
|
||
r.UnderlyingId = um.id;
|
||
r.UnderlyingInstrumentType = td.UnderlyingInstrumentType;
|
||
r.TradeType = BuySellConvert.GetClientBuySell(td.BuySell);
|
||
r.BondType = td.TradeType;
|
||
r.ParticipationRate = td.ParticipationRate;
|
||
r.PrincipalSum = td.PrincipalSum();
|
||
r.AnnualizeFactor = td.AnnualizeFactor;
|
||
|
||
if (isUseApproval)
|
||
{
|
||
bool ActualHasMinusValueOptions = valuedateBLL.SystemDate.UnwindSinglePriceAngle == 1 ? ConsTrade.HasMinusValueOptions.Contains(td.TradeType) : !ConsTrade.HasMinusValueOptions.Contains(td.TradeType);
|
||
|
||
r.SinglePV = r.UnwindPrice * (!ConsTrade.HasMinusValueOptions.Contains(td.TradeType) ? 1 : EodOperationBase.GetSign(td.BuySell));
|
||
r.SinglePVPercentRate = r.UnwindPricePercentRate * (!ConsTrade.HasMinusValueOptions.Contains(td.TradeType) ? 1 : EodOperationBase.GetSign(td.BuySell));
|
||
|
||
r.UnwindPrice = ActualHasMinusValueOptions ? r.UnwindPrice : r.UnwindPrice * (td.BuySell == "买入" ? 1 : -1);
|
||
r.UnwindPricePercentRate = ActualHasMinusValueOptions ? r.UnwindPricePercentRate : r.UnwindPricePercentRate * (td.BuySell == "买入" ? 1 : -1);
|
||
r.Amount = r.Amount * (valuedateBLL.SystemDate.UnwindAmountAngle == 1 ? 1 : EodOperationBase.GetSign(td.BuySell));
|
||
r.QuoteAmount = r.QuoteAmount * (valuedateBLL.SystemDate.UnwindAmountAngle == 1 ? 1 : EodOperationBase.GetSign(td.BuySell));
|
||
|
||
r.UnwindPercentRate *= 100;
|
||
r.UnwindPricePercentRate *= 100;
|
||
r.SinglePVPercentRate *= 100;
|
||
}
|
||
else
|
||
{
|
||
if (td.IsUsePremiumRate != null && td.IsUsePremiumRate.Value)
|
||
{
|
||
r.UnwindPercentRate *= 100;
|
||
}
|
||
else
|
||
{
|
||
r.UnwindPercentRate = 0;
|
||
}
|
||
}
|
||
|
||
ViewBag.trade = td;
|
||
if (!string.IsNullOrEmpty(td.PairTrade))
|
||
{
|
||
var pid = Convert.ToInt32(td.PairTrade);
|
||
ViewBag.PairTrade = db.trade.Find(pid);
|
||
}
|
||
ViewBag.underlying = um;
|
||
ViewBag.variety = variety;
|
||
|
||
//需要审批或者复核的交易都会显示行权审核提交按钮
|
||
ViewBag.IsShowReCheckClose = ((valuedateBLL.SystemDate.CloseReCheck == 1) || (valuedateBLL.SystemDate.CloseReApprove == 1 && hasProcess)) && td.TradeStatus != ConsTrade.平仓待复核;
|
||
ViewBag.isUseApproval = isUseApproval;
|
||
|
||
return View(r);
|
||
}
|
||
|
||
public ActionResult tradeSwapUnwind(string enid, int isswap, bool isUseApproval = false)
|
||
{
|
||
ViewBag.IsSwap = isswap;
|
||
var intid = DataProtectHelper.DecryptInt(enid);
|
||
var td = db.trade.Find(intid);
|
||
tradeBLL.SetFieldsByTradeType(td);
|
||
var r = new trade_cash();
|
||
if (td == null)
|
||
{
|
||
return Content("找不到现金交割交易");
|
||
}
|
||
|
||
var um = DataCacheProvider.GetUnderlyingDataSource().GetData(td.UnderlyingCode);
|
||
var variety = VarietyBLL.GetAllvarietyModel().FirstOrDefault(v => v.id == um.UnderlyingTypeId);
|
||
bool commodity = ConsGlobal.InstrumentType.CalcTypeIsFutures(um.UnderlyingInstrumentType);
|
||
var hasProcess = HasTradeProcess();
|
||
if (hasProcess && (td.TradeStatus == ConsTrade.平仓待复核 || td.TradeStatus == ConsTrade.互换待复核))
|
||
{
|
||
r = db.trade_cash.Where(t => t.TradeId == intid && (t.Action == ClientCashInCashOut.系统操作_平仓费 || t.Action == ClientCashInCashOut.系统操作_互换) && t.ValidState == ConsGlobal.InValid && !t.IsDeleted).OrderByDescending(x => x.OptDate)?.FirstOrDefault();
|
||
if (r == null)
|
||
{
|
||
return Content("该笔交易状态为平仓待复合,而trade_cash表没有相关记录,请检查该笔交易是否有效");
|
||
}
|
||
if (isUseApproval)
|
||
{
|
||
var trade_cash_detail = db.trade_cash_detail.Where(x => x.TradeCashId == r.id).ToList();
|
||
var currencyRate = r.CurrencyRate == 0 ? 1 : (r.CurrencyRate ?? 0);
|
||
r.Amount = (r.QuoteAmount ?? (r.Amount / currencyRate));
|
||
var trade_cash_swap = db.trade_cash_swap.Where(x => x.TradeCashId == r.id)?.FirstOrDefault();
|
||
r.trade_cash_swap.GetFinalPrice = trade_cash_swap.GetFinalPrice;
|
||
r.trade_cash_swap.PayFinalPrice = trade_cash_swap.PayFinalPrice;
|
||
|
||
r.trade_cash_swap.GetCostFee = ((trade_cash_detail.Where(x => x.IsForGet == true && x.TradeCashType == TradeCashTypeEnum.了结手续费.ToString())?.FirstOrDefault()?.QuoteAmount) ?? (trade_cash_swap.GetCostFee / currencyRate));
|
||
r.trade_cash_swap.PayCostFee = ((-trade_cash_detail.Where(x => x.IsForGet == false && x.TradeCashType == TradeCashTypeEnum.了结手续费.ToString())?.FirstOrDefault()?.QuoteAmount) ?? (trade_cash_swap.PayCostFee / currencyRate));
|
||
r.trade_cash_swap.GetExtraAmount = ((trade_cash_detail.Where(x => x.IsForGet == true && x.TradeCashType == TradeCashTypeEnum.利息.ToString())?.FirstOrDefault()?.QuoteAmount) ?? (trade_cash_swap.GetExtraAmount / currencyRate));
|
||
r.trade_cash_swap.PayExtraAmount = ((-trade_cash_detail.Where(x => x.IsForGet == false && x.TradeCashType == TradeCashTypeEnum.利息.ToString())?.FirstOrDefault()?.QuoteAmount) ?? (trade_cash_swap.PayExtraAmount / currencyRate));
|
||
r.trade_cash_swap.GetInitialAmount = ((trade_cash_detail.Where(x => x.IsForGet == true && x.TradeCashType == TradeCashTypeEnum.浮动收益.ToString())?.FirstOrDefault()?.QuoteAmount) ?? (trade_cash_swap.GetInitialAmount / currencyRate));
|
||
r.trade_cash_swap.PayInitialAmount = ((-trade_cash_detail.Where(x => x.IsForGet == false && x.TradeCashType == TradeCashTypeEnum.浮动收益.ToString())?.FirstOrDefault()?.QuoteAmount) ?? (trade_cash_swap.PayInitialAmount / currencyRate));
|
||
r.trade_cash_swap.GetAmount = trade_cash_detail.Where(x => x.IsForGet == true).Sum(x => x.QuoteAmount);
|
||
r.trade_cash_swap.PayAmount = trade_cash_detail.Where(x => x.IsForGet == false).Sum(x => -x.QuoteAmount);
|
||
}
|
||
r.UnwindMethod = r.UnwindMethod ?? 0;
|
||
}
|
||
else
|
||
{
|
||
r = setTradeUnwind(td, um);
|
||
r.UnwindMethod = commodity ? 1 : 0;
|
||
}
|
||
|
||
r.StockEqvNotional = td.StockEqvNotional;
|
||
r.OriginalStockEqvNotional = td.OriginalStockEqvNotional ?? 0;
|
||
r.IsUsePremiumRate = td.IsUsePremiumRate;
|
||
r.IsTradePricePayType = td.IsTradePricePayType;
|
||
|
||
if (!r.UnwindPercentRate.HasValue || r.UnwindPercentRate == 0)
|
||
{
|
||
r.UnwindPercentRate = (r.UnwindStockEqvNotional / td.OriginalStockEqvNotional).Normalize();
|
||
}
|
||
r.UnwindPercentRate *= 100;
|
||
|
||
r.TradeOriginalAmount = td.OriginalNotional / um.CountRatio;
|
||
r.OriginalNotional = td.OriginalNotional;
|
||
r.UnderlyingCode = td.UnderlyingCode;
|
||
r.UnderlyingId = um.id;
|
||
r.UnderlyingInstrumentType = td.UnderlyingInstrumentType;
|
||
r.TradeType = BuySellConvert.GetClientBuySell(td.BuySell);
|
||
r.BondType = td.TradeType;
|
||
r.ClientName = td.ClientName;
|
||
r.TraderName = td.TraderName;
|
||
|
||
//1. 没有执行互换,则互换和平仓的起始日期都是开仓日期
|
||
//2. 执行过互换,则互换和平仓的起始日期都是上个互换日
|
||
var tradeCashSwap = db.trade_cash.Where(y => y.TradeId == td.id && y.Action == "系统操作-互换" && y.ValidState != "InValid" && !y.IsDeleted)
|
||
.OrderByDescending(y => y.id).Select(n => new { n.ValueDate }).FirstOrDefault();
|
||
r.StartDate = tradeCashSwap?.ValueDate ?? td.StartDate.Value;
|
||
|
||
r.ExtraAmount = td.OriginalStockEqvNotional > 0 ? (td.trade_swap.IsTradePriceWhenOpen ? ((td.trade_swap.GetTradePrice ?? 0) - (td.trade_swap.PayTradePrice ?? 0)) : ((td.trade_swap.GetTradePrice ?? 0) - (td.trade_swap.PayTradePrice ?? 0)) * 2) * td.StockEqvNotional / td.OriginalStockEqvNotional : 0;
|
||
|
||
ViewBag.trade = td;
|
||
|
||
ViewBag.TradeSwap = td.trade_swap;
|
||
var tradeCash = db.trade_cash.Where(y => y.TradeId == td.id && (y.Action == "系统操作-互换" || y.Action == "系统操作-平仓费") && y.ValidState != "InValid" && !y.IsDeleted)
|
||
.OrderByDescending(y => y.id).Select(n => new { n.ValueDate }).FirstOrDefault();
|
||
ViewBag.MinDate = tradeCash?.ValueDate ?? td.StartDate.Value;
|
||
|
||
td.trade_swap.GetSpotPrice = td.trade_swap.GetFinalPrice ?? td.trade_swap.GetSpotPrice ?? 0;
|
||
td.trade_swap.PaySpotPrice = td.trade_swap.PayFinalPrice ?? td.trade_swap.PaySpotPrice ?? 0;
|
||
if (!string.IsNullOrEmpty(td.PairTrade))
|
||
{
|
||
var pid = Convert.ToInt32(td.PairTrade);
|
||
ViewBag.PairTrade = db.trade.Find(pid);
|
||
}
|
||
ViewBag.underlying = um;
|
||
ViewBag.variety = variety;
|
||
|
||
//需要审批或者复核的交易都会显示平仓审核提交按钮
|
||
ViewBag.IsShowReCheckClose = ((valuedateBLL.SystemDate.CloseReCheck == 1) || (valuedateBLL.SystemDate.CloseReApprove == 1 && hasProcess)) && td.TradeStatus != ConsTrade.平仓待复核;
|
||
//有审批步骤的需要显是互换审核提交按钮
|
||
ViewBag.IsShowApplySwap = hasProcess && td.TradeStatus != ConsTrade.互换待复核 && !isUseApproval;
|
||
ViewBag.isUseApproval = isUseApproval;
|
||
|
||
return View(r);
|
||
}
|
||
|
||
public ActionResult SetObservationPrice(string enid)
|
||
{
|
||
var valueDate = valuedateBLL.ValueDate;
|
||
var intid = DataProtectHelper.DecryptInt(enid);
|
||
var td = db.trade.FirstOrDefault(n => n.id == intid);
|
||
|
||
if (td == null)
|
||
{
|
||
return ShowError("交易信息不存在");
|
||
}
|
||
|
||
if (valueDate > td.ExerciseDate)
|
||
{
|
||
valueDate = td.ExerciseDate.Value;
|
||
}
|
||
|
||
tradeBLL.SetFieldsByTradeType(td);
|
||
|
||
var model = new SetObservationViewModel(td)
|
||
{
|
||
SetObservationDate = valueDate.ToString("yyyy-MM-dd")
|
||
};
|
||
|
||
if (DataCacheProvider.GetUnderlyingDataSource().TryGetPrice(td.UnderlyingCode, out var price))
|
||
{
|
||
model.SetObservationPrice = price;
|
||
}
|
||
|
||
return View(model);
|
||
}
|
||
|
||
public JsonResult SaveTradeSwapDetails(List<trade_swap_detail> details)
|
||
{
|
||
var id = details.FirstOrDefault()?.TradeId ?? 0;
|
||
var isForGet = details.FirstOrDefault()?.IsForGet;
|
||
var trade = db.trade.Find(id);
|
||
var tradeSwap = db.trade_swap.FirstOrDefault(x => x.TradeId == id);
|
||
var tradeSwapDetailsExist = db.trade_swap_detail.Where(x => x.TradeId == id && x.IsForGet == isForGet);
|
||
db.trade_swap_detail.RemoveRange(tradeSwapDetailsExist);
|
||
details.ForEach(x =>
|
||
{
|
||
x.ExerciseDate = trade.ExerciseDate;
|
||
x.OriginalNotional = x.Notional;
|
||
x.OptDate = DateTime.Now;
|
||
x.OptId = UserId;
|
||
x.OptName = UserName;
|
||
});
|
||
db.trade_swap_detail.AddRange(details);
|
||
db.SaveChanges();
|
||
|
||
return JsonSuccess("调仓成功");
|
||
}
|
||
|
||
public JsonResult GetSwapRateByValueDate(DateTime valueDate, int tradeId, int IsSwap)
|
||
{
|
||
var trade_swap = db.trade_swap.FirstOrDefault(x => x.TradeId == tradeId);
|
||
var oldMaturityDate = new ExtensionTimeService(CurUser).QueryExtensionTimeList(tradeId).OrderByDescending(x => x.OldMaturityDate)?.FirstOrDefault()?.OldMaturityDate;
|
||
var getSwapRate = GetSwapRateByDate(trade_swap.GetSwapTimeAndRate, valueDate, IsSwap, trade_swap.IsGetFloatingProfit, oldMaturityDate);
|
||
var paySwapRate = GetSwapRateByDate(trade_swap.PaySwapTimeAndRate, valueDate, IsSwap, trade_swap.IsPayFloatingProfit, oldMaturityDate);
|
||
var getTradeSwapDetails = db.trade_swap_detail.Where(x => x.TradeId == tradeId && x.IsForGet).ToList();
|
||
var payTradeSwapDetails = db.trade_swap_detail.Where(x => x.TradeId == tradeId && !x.IsForGet).ToList();
|
||
getTradeSwapDetails.ForEach(x =>
|
||
{
|
||
x.SwapRate = GetSwapRateByDate(x.SwapTimeAndRate, valueDate, IsSwap, oldMaturityDate: oldMaturityDate);
|
||
});
|
||
payTradeSwapDetails.ForEach(x =>
|
||
{
|
||
x.SwapRate = GetSwapRateByDate(x.SwapTimeAndRate, valueDate, IsSwap, oldMaturityDate: oldMaturityDate);
|
||
});
|
||
return JsonSuccess("", new
|
||
{
|
||
getSwapRate = getSwapRate.OtcFormatFlex(2, 8),
|
||
paySwapRate = paySwapRate.OtcFormatFlex(2, 8),
|
||
getTradeSwapDetails,
|
||
payTradeSwapDetails
|
||
});
|
||
}
|
||
|
||
private double GetSwapRateByDate(string swapTimeAndRate, DateTime valueDate, int IsSwap, bool IsFloatingProfit = true, DateTime? oldMaturityDate = null)
|
||
{
|
||
double swapRate = 0;
|
||
var customizedResults = QdpHelper.ParseAutocallCustomizedInfo(swapTimeAndRate);
|
||
var dates = customizedResults.Item1;
|
||
if (dates == null)
|
||
{
|
||
return swapRate;
|
||
}
|
||
var getSwapRates = customizedResults.Item2;
|
||
var latestDate = dates.Where(x => x.DateTime >= valueDate).OrderBy(x => x.DateTime).FirstOrDefault();
|
||
|
||
//展期情况互换利率获取最后一个日期的互换利率
|
||
if (latestDate == null)
|
||
{
|
||
latestDate = dates.Max();
|
||
}
|
||
|
||
if (latestDate != null)
|
||
{
|
||
if (getSwapRates != null && getSwapRates.Any())
|
||
{
|
||
swapRate = getSwapRates[TradeObservationHelper.GetDateIndex(dates, latestDate)];
|
||
}
|
||
}
|
||
|
||
return swapRate;
|
||
}
|
||
|
||
public JsonResult batchSaveManuallyTradeObservationPrice(DateTime valueDate, List<underlying_manager> underlyingList, string tradeIds)
|
||
{
|
||
var tradeIdList = tradeIds.Split(',');
|
||
var trades = db.trade.Where(x => tradeIdList.Contains(x.id.ToString()) || tradeIdList.Contains(x.ParentTradeId.ToString())).ToList();
|
||
foreach (var trade in trades)
|
||
{
|
||
var underlying = underlyingList.FirstOrDefault(x => x.UnderlyingCode == trade.UnderlyingCode);
|
||
if (underlying != null)
|
||
{
|
||
var recordsRemove = db.manually_trade_observation_price.Where(x => x.TradeId == trade.id && x.ValueDate == valueDate);
|
||
db.manually_trade_observation_price.RemoveRange(recordsRemove);
|
||
db.manually_trade_observation_price.Add(new manually_trade_observation_price()
|
||
{
|
||
TradeId = trade.id,
|
||
//TradeNumber = trade.TradeNumber,
|
||
ValueDate = valueDate,
|
||
Price = underlying.Price,
|
||
OptDate = DateTime.Now,
|
||
OptId = CurUser.UserId,
|
||
OptName = CurUser.UserName
|
||
});
|
||
}
|
||
db.TradeAuditLog.Add(new TradeAuditLog
|
||
{
|
||
TradeId = trade.id,
|
||
AuditFlag = TradeAuditFlag.operation,
|
||
OptType = "批量设置观察价格",
|
||
Changes = null,
|
||
DataType = "00",
|
||
OptId = UserId,
|
||
OptName = UserName,
|
||
OptDate = DateTime.Now
|
||
});
|
||
}
|
||
db.SaveChanges();
|
||
|
||
foreach (var td in trades)
|
||
{
|
||
var tradeStatus = td.TradeStatus;
|
||
new TradeExtendService(CurUser, db).SetTradeExtend(new[] { td }, tracking: true);
|
||
var underlying = underlyingList.FirstOrDefault(x => x.UnderlyingCode == td.UnderlyingCode);
|
||
if (underlying == null)
|
||
{
|
||
return JsonError($"批量设置的标的价格未包含标的:{td.UnderlyingCode}");
|
||
}
|
||
var baseService = new TradeServiceBase(CurUser, db);
|
||
|
||
switch (td.TradeType)
|
||
{
|
||
case "障碍期权":
|
||
if (!string.IsNullOrEmpty(td.trade_barrier_option.KnockInOutStatus))
|
||
{
|
||
return JsonError("请确认该交易的敲入敲出状态");
|
||
}
|
||
if (td.TradeStatus != ConsTrade.确认成交)
|
||
{
|
||
return JsonError("该交易非确认成交状态,无法设置");
|
||
}
|
||
new BarrierOptionKnockioService(baseService).CheckBarrierKnockInOutStatus(td, td.trade_barrier_option, valueDate, underlying.Price, underlying.Price, underlying.Price);
|
||
break;
|
||
case "双鲨期权":
|
||
if (!string.IsNullOrEmpty(td.trade_double_sharkfin_option.KnockInOutStatus))
|
||
{
|
||
return JsonError("请确认该交易的敲入敲出状态");
|
||
}
|
||
if (td.TradeStatus != ConsTrade.确认成交)
|
||
{
|
||
return JsonError("该交易非确认成交状态,无法设置");
|
||
}
|
||
new DoubleSharkOptionKnockoutService(baseService).CheckDoubleSharkFinKnockOutStatus(td, td.trade_double_sharkfin_option, valueDate, underlying.Price, underlying.Price);
|
||
break;
|
||
case "区间累积期权":
|
||
new TradeRangeAccrualService(baseService).CheckRangeAccrualBonus(td, td.trade_rangeaccrual, valueDate, underlying.Price ?? 0);
|
||
break;
|
||
case "凤凰期权":
|
||
new TradeAutocallBLL(baseService).CheckAutocallKnockInOutStatus(td, td.trade_autocall, valueDate, underlying.Price ?? 0, null);
|
||
break;
|
||
case "雪球期权":
|
||
new TradeSnowballBLL(baseService).CheckSnowballKnockInOutStatus(td, td.trade_snowball, valueDate, underlying.Price ?? 0, null);
|
||
break;
|
||
case "气囊结构":
|
||
new TradeAirbagService(baseService).CheckAirbagKnockInStatus(td, td.trade_airbag, valueDate, underlying.Price ?? 0);
|
||
break;
|
||
case "累计期权":
|
||
new TradeAccumulatorService(baseService).CheckAccumulatorKnockInStatus(td, td.trade_accumulator_option, valueDate, underlying.Price ?? 0);
|
||
break;
|
||
}
|
||
|
||
if (tradeStatus != td.TradeStatus)
|
||
{
|
||
//删除E/Bod_Trade记录
|
||
baseService.RemoveEodTradeAndFutureInfo(false, td.id, valueDate);
|
||
}
|
||
|
||
db.SaveChanges();
|
||
}
|
||
|
||
return JsonSuccess("批量设置观察日价格成功!");
|
||
}
|
||
|
||
public ActionResult BatchSetObservationPrice(string tradeIds)
|
||
{
|
||
ViewBag.TradeIds = tradeIds;
|
||
var tradeIdList = tradeIds.Split(',');
|
||
var trades = db.trade.Where(x => tradeIdList.Contains(x.id.ToString()));
|
||
var underlyingIds = trades.Select(x => x.UnderlyingId).Distinct();
|
||
var underlyingList = db.underlying_manager.Where(x => underlyingIds.Contains(x.id)).ToList();
|
||
return View(underlyingList);
|
||
}
|
||
|
||
public JsonResult checkBatchSetObservationPrice(List<int> tradeids)
|
||
{
|
||
if (tradeids == null || !tradeids.Any())
|
||
{
|
||
return JsonError("请选中交易");
|
||
}
|
||
|
||
var tradesStatusInvalid = db.trade.Where(x => tradeids.Contains(x.id)
|
||
&& x.TradeStatus != ConsTrade.确认成交);
|
||
if (tradesStatusInvalid.Any())
|
||
{
|
||
return JsonError("请确保选择的交易状态为确认成交");
|
||
}
|
||
|
||
var tradesTypeInvalid = db.trade.Where(x => tradeids.Contains(x.id)
|
||
&& x.TradeType != "二元期权"
|
||
&& x.TradeType != "障碍期权"
|
||
&& x.TradeType != "双鲨期权"
|
||
&& x.TradeType != "区间累积期权"
|
||
&& x.TradeType != "凤凰期权"
|
||
&& x.TradeType != "雪球期权"
|
||
&& x.TradeType != "累计期权"
|
||
&& x.TradeType != "结构化交易");
|
||
if (tradesTypeInvalid.Any())
|
||
{
|
||
return JsonError("请确保选择的交易类型存在观察条款");
|
||
}
|
||
|
||
return JsonSuccess();
|
||
}
|
||
|
||
public JsonResult IsNumOfSmoothingDaysInRange(int numOfSmoothingDays, DateTime tradeDate, DateTime exerciseDate)
|
||
{
|
||
if (numOfSmoothingDays > QdpCalendarHelper.GetNonHolidayDaysBetween(tradeDate, exerciseDate) + 1)
|
||
{
|
||
return Json(false);
|
||
}
|
||
|
||
return Json(true);
|
||
}
|
||
|
||
public ActionResult structureoptionV2(string name)
|
||
{
|
||
//设置默认值
|
||
StructureOption_Code.StructureOptions.ForEach(s =>
|
||
{
|
||
s.TradeDate = valuedateBLL.ValueDate.Date;
|
||
});
|
||
var option = StructureOption_Code.StructureOptions.FirstOrDefault(o => o.Name == name);
|
||
var config = new SysUserConfigService(CurUser).GetConfigData<OtcWebUserConfig>(Server.CacheProvider);
|
||
ViewBag.SimpleMode = config?.Pricing_SimpleMode ?? true;
|
||
return View(option);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 生成某客户在某日期已行权或已到期的交易的报告(行权日报告,pdf格式)
|
||
/// </summary>
|
||
/// <param name="ClientId">客户Id </param>
|
||
/// <param name="ExerciseDate">到日期</param>
|
||
/// <returns></returns>
|
||
public ActionResult clientMaturityDateTradePreview(int? ClientId, DateTime? ExerciseDate)
|
||
{
|
||
var systemDate = valuedateBLL.ValueDate;
|
||
var client = DataCacheProvider.GetClientDataSource().GetData(ClientId ?? 0);
|
||
var bll = new tradeBLL();
|
||
var req = new TradeReq
|
||
{
|
||
ExerciseDate = ExerciseDate ?? systemDate
|
||
};
|
||
req.ExerciseDateStart = req.ExerciseDate;
|
||
req.ExerciseDateEnd = req.ExerciseDate;
|
||
req.ClientId = ClientId;
|
||
//req.TradeStatus = ConsTrade.确认成交;
|
||
req.TradeStatusList = new List<string> { ConsTrade.已到期, ConsTrade.已执行, ConsTrade.确认成交, ConsTrade.期初价格已确认 };
|
||
req.LoginUserId = CurUser.UserId;
|
||
req.sidx = "OptDate";
|
||
req.sord = "desc";
|
||
|
||
var userAsset = CurUser.GetAssetUnitIds();
|
||
var tradeList = bll.SearchTradeList(req, true, true);
|
||
|
||
//string saveFileDir = Server.MapPath("~/App_Docs/MaturityDateTrade");
|
||
//string fileName = @"D:\pdf\tests.pdf";
|
||
//string filePath = Path.Combine(saveFileDir, client.Name+"_"+req.ExerciseDate.Value.Date);
|
||
|
||
//设置文件名称
|
||
var saveFileDir = Server.MapPath("~/App_Docs/ManturityDateTrade");
|
||
if (!Directory.Exists(saveFileDir))
|
||
{
|
||
Directory.CreateDirectory(saveFileDir);
|
||
}
|
||
|
||
var fileName = $"行权日报告-{req.ExerciseDate.Value:yyyy-MM-dd}-{client.Name}.pdf";
|
||
var filePath = Path.Combine(saveFileDir, fileName);
|
||
|
||
var document = new Document(HeaderAndFooterEvent.rect);
|
||
//此处使用的是http请求的流,你也可以使用文件流Stream
|
||
var writer = PdfWriter.GetInstance(document, new FileStream(filePath, FileMode.Create));
|
||
try
|
||
{
|
||
document.Open();
|
||
writer.PageEvent = new HeaderAndFooterEvent();
|
||
|
||
HeaderAndFooterEvent.PAGE_NUMBER = true;//实现页眉跟页脚
|
||
HeaderAndFooterEvent.tpl = writer.DirectContent.CreateTemplate(1000, 1000); //定义模板
|
||
|
||
HeaderAndFooterEvent.HeaderLeft = "";
|
||
HeaderAndFooterEvent.HeaderRight = PS.Config.CompanyName ?? "";
|
||
//HeaderAndFooterEvent.FooterLeft = "TEL:010-87922095";
|
||
HeaderAndFooterEvent.FooterRight = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "(UTC)";
|
||
|
||
//每次在添加文本内容之前可以先设置字体,有效期持续到重新设置之前
|
||
|
||
HeaderAndFooterEvent.SetFont(BaseColor.DARK_GRAY, "宋体", 15,iTextSharp.text.Font.BOLD);
|
||
document.Add(HeaderAndFooterEvent.AddParagraph("客户行权日报告", 1, 1.5f));
|
||
HeaderAndFooterEvent.SetFont(BaseColor.DARK_GRAY, "宋体", 12);
|
||
document.Add(HeaderAndFooterEvent.AddParagraph("客户: " + client.Name, 0, 1.5f));
|
||
document.Add(HeaderAndFooterEvent.AddParagraph("日期: " + req.ExerciseDate.Value.ToString("yyyy-MM-dd"), 0, 1.5f));
|
||
//增加空行
|
||
document.Add(HeaderAndFooterEvent.AddParagraph(" ", 0, 1.5f));
|
||
//输出客户行权报告表格信息
|
||
var table = new PdfPTable(10);
|
||
table.SetWidths(new float[] { 100, 120, 100, 150, 180, 130, 100, 100, 100, 100 });
|
||
|
||
//table.HorizontalAlignment = Element.ALIGN_RIGHT;
|
||
//table.SpacingBefore = (5);
|
||
//table.SpacingAfter = (5);
|
||
|
||
var bftitle = BaseFont.CreateFont("C:\\Windows\\Fonts\\SIMHEI.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); //用系统中的字体文件SimHei.ttf创建文件字体
|
||
var fonttitle = new iTextSharp.text.Font(bftitle, 8);
|
||
var cellTexts = new[] { "交易方向", "期权类型", "看涨看跌", "行权方式", "到期日", "标的", "行权价", "期初价格", "名义本金", "交易数量" };
|
||
foreach (var text in cellTexts)
|
||
{
|
||
var cell = new PdfPCell(new Phrase(text, fonttitle))
|
||
{
|
||
BackgroundColor = (BaseColor.GRAY)
|
||
};
|
||
table.AddCell(cell);
|
||
}
|
||
|
||
if (tradeList != null && tradeList.Count > 0)
|
||
{
|
||
var underlyingCodes = tradeList.Select(t => t.UnderlyingId).Distinct().ToList();
|
||
var varietyDict = (from um in db.underlying_manager
|
||
join var in db.variety on um.UnderlyingTypeId equals var.id
|
||
where underlyingCodes.Contains(um.id)
|
||
select new { underlyingId = um.id, variety = var }).ToDictionary(t => t.underlyingId, t => t.variety);
|
||
foreach (var trade in tradeList)
|
||
{
|
||
table.AddCell(new Phrase(BuySellConvert.GetClientBuySell(trade.BuySell), fonttitle));
|
||
table.AddCell(new Phrase(trade.TradeType, fonttitle));
|
||
table.AddCell(new Phrase(trade.CallPut == "Call" ? "看涨" : "看跌", fonttitle));
|
||
|
||
if (!string.IsNullOrEmpty(trade.ExerciseMode))
|
||
{
|
||
if (trade.ExerciseMode == "European")
|
||
{
|
||
table.AddCell(new Phrase("欧式", fonttitle));
|
||
}
|
||
else if (trade.ExerciseMode == "American")
|
||
{
|
||
table.AddCell(new Phrase("美式", fonttitle));
|
||
}
|
||
else
|
||
{
|
||
table.AddCell(new Phrase("", fonttitle));
|
||
}
|
||
}
|
||
else
|
||
{
|
||
table.AddCell(new Phrase("", fonttitle));
|
||
}
|
||
table.AddCell(new Phrase(trade.ExerciseDate == null ? "" : trade.ExerciseDate.Value.ToString("yyyy-MM-dd"), fonttitle));
|
||
table.AddCell(new Phrase(trade.UnderlyingCode, fonttitle));
|
||
table.AddCell(new Phrase(trade.Strike == null ? "0.0" : trade.Strike.Value.ToString("###,##0.00"), fonttitle));
|
||
var initialSpotPrice = trade.SpotPrice;
|
||
table.AddCell(new Phrase(initialSpotPrice == null ? "0.0" : initialSpotPrice.Value.ToString("###,##0.00"), fonttitle));
|
||
table.AddCell(new Phrase(trade.StockEqvNotional == 0 ? "0.0" : trade.StockEqvNotional.ToString("###,##0.00") + "", fonttitle));
|
||
|
||
if (trade.UnderlyingInstrumentType == "Stock")
|
||
{
|
||
table.AddCell(new Phrase("", fonttitle));
|
||
}
|
||
else
|
||
{
|
||
var QuoteUnitSingle = "";
|
||
if (varietyDict != null && varietyDict.ContainsKey(trade.UnderlyingId))
|
||
{
|
||
QuoteUnitSingle = varietyDict[trade.UnderlyingId].QuoteUnitSingle;
|
||
}
|
||
table.AddCell(new Phrase(trade.TradeAmount == 0 ? "0.0" : trade.TradeAmount.ToString("###,##0.00") + QuoteUnitSingle, fonttitle));
|
||
}
|
||
|
||
}
|
||
}
|
||
else
|
||
{
|
||
var cell = new PdfPCell(new Phrase("无", fonttitle))
|
||
{
|
||
BackgroundColor = (BaseColor.YELLOW),
|
||
HorizontalAlignment = (Element.ALIGN_CENTER),
|
||
Colspan = (10)
|
||
};
|
||
table.AddCell(cell);
|
||
}
|
||
table.DefaultCell.BackgroundColor = (null);
|
||
|
||
document.Add(table);
|
||
}
|
||
finally
|
||
{
|
||
writer.Flush();
|
||
writer.CloseStream = true;
|
||
document.Dispose();
|
||
}
|
||
return File(filePath, "application/pdf");
|
||
}
|
||
|
||
public JsonResult SendEMailMaturityDateTrade(int? ClientId, DateTime? ExerciseDate)
|
||
{
|
||
var message = new MaturityDateTradeService(CurUser)
|
||
.SendEMailMaturityDateTrade(ClientId, ExerciseDate);
|
||
return JsonSuccess(message);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 检查标的是否有 已到期, 已执行, 已平仓 之外状态的交易存在 检查标的是否存在黑白名单中
|
||
/// </summary>
|
||
public JsonResult CheckUnderlyingTrade(int[] uids)
|
||
{
|
||
var noFixedTrades = db.trade.Where(t => uids.Contains(t.UnderlyingId) && !ConsTrade.TradeCompleteStatus.Contains(t.TradeStatus) && t.ValidState != ConsGlobal.InValid).ToList();
|
||
///// 获取到标的信息
|
||
//var code = db.underlying_manager.FirstOrDefault(d => uids.Contains(d.id));
|
||
//if (code.UnderlyingInstrumentType == "Stock")
|
||
//{
|
||
// if (db.Stock_BlackWhite.Any(c => c.BlackWhiteState == 0) && db.Stock_BlackWhite.Any(c => c.BlackWhiteState == 0 && c.UnderlyingCode == code.UnderlyingCode))
|
||
// {
|
||
// return JsonError("此标的在黑名单中,禁止启用");
|
||
// }
|
||
// if (db.Stock_BlackWhite.Any(c => c.BlackWhiteState == 1) && db.Stock_BlackWhite.Any(c => c.BlackWhiteState == 1 && c.UnderlyingCode != code.UnderlyingCode))
|
||
// {
|
||
// return JsonError("此标的不在白名单中,禁止启用");
|
||
// }
|
||
//}
|
||
return JsonSuccess("", noFixedTrades);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 检查障碍期权是否可以平仓执行
|
||
/// </summary>
|
||
public JsonResult checkBarrierUnwind(string enid)
|
||
{
|
||
var intid = DataProtectHelper.DecryptInt(enid);
|
||
var td = db.trade.Find(intid);
|
||
tradeBLL.SetFieldsByTradeType(td);
|
||
|
||
if (td.trade_barrier_option != null)
|
||
{
|
||
switch (td.trade_barrier_option.BarrierType)
|
||
{
|
||
case "下降敲入":
|
||
case "上升敲入":
|
||
case "双障碍敲入":
|
||
return JsonSuccess();
|
||
case "上升敲出":
|
||
case "下降敲出":
|
||
case "双障碍敲出":
|
||
if (td.trade_barrier_option.KnockInOutStatus == ConsTrade.KnockState.KnockedOut)
|
||
{
|
||
return JsonError("障碍期权类型为:" + td.trade_barrier_option.BarrierType + " 已敲出无需平仓!");
|
||
}
|
||
else
|
||
{
|
||
return JsonSuccess();
|
||
};
|
||
default:
|
||
return JsonError("障碍期权类型:" + td.trade_barrier_option.BarrierType + " 无法识别!");
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return JsonError("错误交易,障碍期权Option信息不存在!");
|
||
}
|
||
}
|
||
|
||
[MyAuthorize("交易管理-交易审批")]
|
||
public ActionResult TradeApproval()
|
||
{
|
||
return View();
|
||
}
|
||
|
||
public JsonResult tradeOpeningProcessQuery(TradeReq req)
|
||
{
|
||
req.LoginUserId = CurUser.UserId;
|
||
req.AssetIdList = AssetUnitModel.IntersectAssetUnits(req.AssetIdGroupList, req.AssetIdList).ToList();
|
||
req.UserAssets = CurUser.GetAssetUnitIds();
|
||
req.UserClients = CurUser.GetClientIdsByCurUser(CurUser.交易管理_查看所有交易);
|
||
var sList = new tradeBLL().tradeOpeningProcessQuery(req, CurUser.UserId, out var gsum, false);
|
||
if (sList.rows != null && sList.rows.Any())
|
||
{
|
||
new TradeDalService(CurUser).SetStructureInfo(sList.rows);
|
||
|
||
foreach (var item in sList.rows)
|
||
{
|
||
if (item.TradeType == "合成价差期权")
|
||
{
|
||
item.SyntheticUnderlyingTipsInfo = synthetic_underlyingBLL.GetUnderlyingTipsInfo(item.UnderlyingCode);
|
||
}
|
||
//审批流程中,当前需要审批的角色是否有复核权限
|
||
//item.HasCheckRight = RoleRight.GetRoleFunction(item.ProcessRoleId, "交易复核");
|
||
//RoleRight.GetRoleFunction(item.ProcessRoleId, "交易行权审核"):有审批流程,且当前需要审批的角色有复核权限
|
||
//item.ProcessRoleId == null: 没有审批流程
|
||
//(valuedateBLL.SystemDate.CloseReApprove != 1):参数配置行权/平仓不需要审批
|
||
//(valuedateBLL.SystemDate.CloseReCheck == 1):参数配置行权/平仓需要复核
|
||
//HasExerciseCheckRight/HasUnwindCheckRight: 是否需要复核
|
||
item.HasExerciseCheckRight = (RoleRight.GetRoleFunction(item.ProcessRoleId, "交易行权审核") || item.ProcessRoleId == null || (valuedateBLL.SystemDate.CloseReApprove != 1)) && (valuedateBLL.SystemDate.CloseReCheck == 1);
|
||
item.HasUnwindCheckRight = (RoleRight.GetRoleFunction(item.ProcessRoleId, "交易平仓审核") || item.ProcessRoleId == null || (valuedateBLL.SystemDate.CloseReApprove != 1)) && (valuedateBLL.SystemDate.CloseReCheck == 1);
|
||
}
|
||
}
|
||
return Json(sList);
|
||
}
|
||
|
||
public ActionResult finishedTradesUpload()
|
||
{
|
||
return View();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 批量生成结算确认书
|
||
/// </summary>
|
||
public JsonResult BatchGenerateSettleBill(TradeReq req)
|
||
{
|
||
req.AssetIdList = AssetUnitModel.IntersectAssetUnits(req.AssetIdGroupList, req.AssetIdList).ToList();
|
||
var message = new SettleBillService(CurUser).BatchGenerateSettleBill(req);
|
||
return JsonSuccess(message);
|
||
}
|
||
|
||
public JsonResult GenerateSettleBillForSingle(TradeReq req)
|
||
{
|
||
var message = new SettleBillService(CurUser).GenerateSettleBillForSingle(req);
|
||
return JsonSuccess(message);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 生成结算确认书
|
||
/// </summary>
|
||
public JsonResult GJGenerateSettleBill(List<int> tradeIds, string docType, int? userId, string userName)
|
||
{
|
||
var user = new OptUserInfo(userId ?? UserId, userName.TrimToNull() ?? UserName, OptUserFrom.WebUI);
|
||
|
||
if (new TradeContractGenerateService(user).GJGenerateConfirmBook(tradeIds, docType, out var errors, out var files))
|
||
{
|
||
return JsonSuccess("生成成功", files);
|
||
}
|
||
|
||
return JsonError(string.Join("\r\n", errors.AsEnumerable()), files);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 生成结算确认书
|
||
/// </summary>
|
||
public JsonResult GJGenerateSettleBillByTradeCashIds(List<int> tradeCashIds, string docType, int? userId, string userName, DateTime? startDate, DateTime? endDate)
|
||
{
|
||
if ("doc".Equals(docType, StringComparison.OrdinalIgnoreCase))
|
||
{
|
||
docType = "DOCX";
|
||
}
|
||
docType = docType.ToLower();
|
||
if (!userId.HasValue)
|
||
{
|
||
userId = CurUser.UserId;
|
||
}
|
||
if (userName.IsNullOrWhiteSpace())
|
||
{
|
||
userName = CurUser.UserName;
|
||
}
|
||
|
||
var results = new List<TradeDocGenerateResult>();
|
||
var files = new List<string>();
|
||
var errors = new List<string>();
|
||
var tradeIds = yldb.trade_cash.Where(l => tradeCashIds.Contains(l.id)).Select(l => l.TradeId).ToList();
|
||
if (PS.Config.Company == CompanyEnum.国信金阳)
|
||
{
|
||
var IsTradeContract = yldb.trade_contract_r.Where(l => l.IsValid && tradeIds.Contains(l.TradeId) && l.Type == "交易确认书").Select(l => l.TradeId).ToList();
|
||
var IsTradeIds = tradeIds.Where(l => !IsTradeContract.Contains(l)).ToList();
|
||
if (IsTradeIds.Count > 0)
|
||
{
|
||
throw new ServiceException(String.Join(",", yldb.trade.Where(l => IsTradeIds.Contains(l.id)).Select(l => l.TradeNumber).ToArray()) + "请生成该交易编号相应交易确认书");
|
||
}
|
||
if (!new TradeContractGenerateService(CurUser).GXJY_CorrespondingConfirmationTemplate(tradeIds, out string Msg))
|
||
{
|
||
throw new ServiceException(Msg);
|
||
}
|
||
}
|
||
if (PS.Config.Company == CompanyEnum.海通)
|
||
{
|
||
var query =
|
||
from t in yldb.trade
|
||
join tc in yldb.trade_cash
|
||
on t.id equals tc.TradeId
|
||
where tradeCashIds.Contains(tc.id) &&
|
||
tc.ValidState != ConsGlobal.InValid && !tc.IsDeleted &&
|
||
(((tc.Action == ClientCashInCashOut.系统操作_行权费
|
||
|| tc.Action == ClientCashInCashOut.系统操作_平仓费) &&
|
||
(tc.ExerciseWay == TradeCashExerciseWayEnum.到期行权
|
||
|| tc.ExerciseWay == TradeCashExerciseWayEnum.提前终止行权))
|
||
|| tc.Action == ClientCashInCashOut.系统操作_票息)
|
||
select new { tc.id, t.ClientId };
|
||
var clientTradeDict =
|
||
query.AsEnumerable().GroupBy(O => O.ClientId)
|
||
.ToDictionary(K => K.Key, V => V.Select(O => O.id).ToList());
|
||
foreach (var tradeCashs in clientTradeDict)
|
||
{
|
||
results =
|
||
new RDBatchEndBillGenerateService(CurUser)
|
||
.Generate(tradeCashs.Value, null, "PDF", CurUser.UserId, CurUser.UserName).ToList();
|
||
errors.AddRange(results.Where(n => !string.IsNullOrWhiteSpace(n.ErrorMessage)).Select(n => n.ErrorMessage).ToArray());
|
||
files.AddRange(results.Where(n => !string.IsNullOrWhiteSpace(n.OutputFilePath)).Select(n => n.OutputFilePath).ToList());
|
||
if (errors.Any()) { break; }
|
||
}
|
||
}
|
||
else if (PS.Config.Is瑞达)
|
||
{
|
||
var tradeTypeArr = new List<string>() { "远期", "亚式期权" };
|
||
var query =
|
||
(from tc in yldb.trade_cash.Where(O => tradeCashIds.Contains(O.id) && !O.IsDeleted)
|
||
join t in yldb.trade
|
||
on tc.TradeId equals t.id
|
||
select new
|
||
{
|
||
tc.id,
|
||
tc.ValueDate,
|
||
t.ClientId,
|
||
tradeType = tradeTypeArr.Contains(t.TradeType) ? t.TradeType : "Normal",
|
||
IsSW = t.StructureType == "掉期" ? "0" : "1"
|
||
})//通过传入的tradeCashId查出对应的记录;
|
||
.Union
|
||
(from pid in (from interTc in yldb.trade_cash.Where(O => tradeCashIds.Contains(O.id) && !O.IsDeleted)
|
||
join interT in yldb.trade
|
||
on interTc.TradeId equals interT.id
|
||
where interT.ParentTradeId != 0
|
||
select new { interT.ParentTradeId, interTc.ValueDate, interTc.Action })
|
||
join t in yldb.trade
|
||
on pid.ParentTradeId equals t.ParentTradeId
|
||
join tc in yldb.trade_cash
|
||
on new { t.id, pid.ValueDate, pid.Action } equals new { id = tc.TradeId, tc.ValueDate, tc.Action }
|
||
where !tc.IsDeleted
|
||
select new
|
||
{
|
||
tc.id,
|
||
tc.ValueDate,
|
||
t.ClientId,
|
||
tradeType = tradeTypeArr.Contains(t.TradeType) ? t.TradeType : "Normal",
|
||
IsSW = t.StructureType == "掉期" ? "0" : "1"
|
||
}//再通过传入的tradeCashId查出对应的兄弟交易的记录;
|
||
);
|
||
|
||
var clientTradeDict =
|
||
query.AsEnumerable().GroupBy(O => O.ClientId + " " + O.ValueDate + " " + O.tradeType + " " + O.IsSW)
|
||
.ToDictionary(K => K.Key, V => V.Select(O => O.id).ToList());
|
||
foreach (var trades in clientTradeDict)
|
||
{
|
||
var result =
|
||
new RDBatchEndBillGenerateService(CurUser)
|
||
.Generate(trades.Value, null, "PDF", CurUser.UserId, CurUser.UserName).ToList();
|
||
results.AddRange(result);
|
||
errors.AddRange(results.Where(n => !string.IsNullOrWhiteSpace(n.ErrorMessage)).Select(n => n.ErrorMessage).ToArray());
|
||
files.AddRange(results.Where(n => !string.IsNullOrWhiteSpace(n.OutputFilePath)).Select(n => n.OutputFilePath).ToList());
|
||
if (errors.Any()) { break; }
|
||
}
|
||
}
|
||
else if (PS.Config.Is兴证)
|
||
{
|
||
var tradeTypeArr = new List<string>() { "远期", "亚式期权" };
|
||
var query =
|
||
(from tc in yldb.trade_cash.Where(O => tradeCashIds.Contains(O.id) && !O.IsDeleted)
|
||
join t in yldb.trade
|
||
on tc.TradeId equals t.id
|
||
select new
|
||
{
|
||
tc.id,
|
||
tc.ValueDate,
|
||
t.ClientId,
|
||
tradeType = tradeTypeArr.Contains(t.TradeType) ? t.TradeType : "Normal",
|
||
IsSW = t.StructureType == "掉期" ? "0" : "1"
|
||
});
|
||
//通过传入的tradeCashId查出对应的记录;
|
||
|
||
var clientTradeDict =
|
||
query.AsEnumerable().GroupBy(O => O.id)
|
||
.ToDictionary(K => K.Key, V => V.Select(O => O.id).ToList());
|
||
foreach (var trades in clientTradeDict)
|
||
{
|
||
var result =
|
||
new RDBatchEndBillGenerateService(CurUser)
|
||
.Generate(trades.Value, null, "PDF", CurUser.UserId, CurUser.UserName).ToList();
|
||
results.AddRange(result);
|
||
errors.AddRange(results.Where(n => !string.IsNullOrWhiteSpace(n.ErrorMessage)).Select(n => n.ErrorMessage).ToArray());
|
||
files.AddRange(results.Where(n => !string.IsNullOrWhiteSpace(n.OutputFilePath)).Select(n => n.OutputFilePath).ToList());
|
||
if (errors.Any()) { break; }
|
||
}
|
||
}
|
||
else if (PS.Config.Company == CompanyEnum.中金)
|
||
{
|
||
if (tradeCashIds == null || tradeCashIds.Count() < 0)
|
||
{
|
||
if (startDate == endDate)
|
||
{
|
||
var tcs = yldb.trade_cash.Where(o => o.ValueDate == startDate);
|
||
tradeCashIds = tcs.Select(o => o.id).ToList();
|
||
}
|
||
else
|
||
{
|
||
throw new ServiceException("请保证已选择交易或实际终止日为一天");
|
||
}
|
||
}
|
||
var query =
|
||
(from tc in yldb.trade_cash.Where(O => tradeCashIds.Contains(O.id) && !O.IsDeleted)
|
||
join t in yldb.trade
|
||
on tc.TradeId equals t.id
|
||
select new
|
||
{
|
||
tc.id,
|
||
tc.ValueDate,
|
||
t.ClientId,
|
||
tradeid = t.ParentTradeId == 0 ? t.id : t.ParentTradeId,
|
||
t.UnderlyingCode
|
||
})//通过传入的tradeCashId查出对应的记录;
|
||
.Union
|
||
(from pid in (from interTc in yldb.trade_cash.Where(O => tradeCashIds.Contains(O.id) && !O.IsDeleted)
|
||
join interT in yldb.trade
|
||
on interTc.TradeId equals interT.id
|
||
where interT.ParentTradeId != 0
|
||
select new { interT.ParentTradeId, interTc.ValueDate, interTc.Action, interTc.Notional, interTc.UnwindNotional, interTc.ExerciseWay })
|
||
join t in yldb.trade
|
||
on pid.ParentTradeId equals t.ParentTradeId
|
||
join tc in yldb.trade_cash //后期需要更改
|
||
on new { t.id, pid.ValueDate, pid.Action, pid.Notional, pid.UnwindNotional, pid.ExerciseWay } equals new { id = tc.TradeId, tc.ValueDate, tc.Action, tc.Notional, tc.UnwindNotional, tc.ExerciseWay }
|
||
where !tc.IsDeleted
|
||
select new
|
||
{
|
||
tc.id,
|
||
tc.ValueDate,
|
||
t.ClientId,
|
||
tradeid = t.ParentTradeId == 0 ? t.id : t.ParentTradeId,
|
||
t.UnderlyingCode
|
||
}//再通过传入的tradeCashId查出对应的兄弟交易的记录;
|
||
);
|
||
var clientTradeDict = new Dictionary<string, List<int>>();
|
||
var clientIds = query.AsEnumerable().Select(o => o.ClientId).Distinct().ToList();
|
||
var clients = DbContextFactory.GetClientDbContext(CurUser).client.Where(o => clientIds.Contains(o.id));
|
||
foreach (var c in clients)
|
||
{
|
||
var tcs = query.Where(o => o.ClientId == c.id);
|
||
if (c.BoundSide == BoundSideEnum.北向)
|
||
{
|
||
foreach (var tc in tcs)
|
||
{
|
||
clientTradeDict.Add(tc.id.ToString(), new List<int> { tc.id });
|
||
}
|
||
}
|
||
else
|
||
{
|
||
var Dict = tcs.AsEnumerable().GroupBy(O => O.ClientId + " " + O.ValueDate)
|
||
.ToDictionary(K => K.Key, V => V.Select(O => O.id).ToList());
|
||
foreach (var row in Dict)
|
||
{
|
||
clientTradeDict.Add(row.Key, row.Value);
|
||
}
|
||
}
|
||
}
|
||
foreach (var trades in clientTradeDict)
|
||
{
|
||
var result =
|
||
new RDBatchEndBillGenerateService(CurUser)
|
||
.Generate(trades.Value, null, docType, CurUser.UserId, CurUser.UserName).ToList();
|
||
results.AddRange(result);
|
||
}
|
||
errors = results.Where(n => !string.IsNullOrWhiteSpace(n.ErrorMessage)).Select(n => n.ErrorMessage).ToList();
|
||
files = results.Where(n => !string.IsNullOrWhiteSpace(n.OutputFilePath)).Select(n => n.OutputFilePath).ToList();
|
||
}
|
||
else if (PS.Config.Company == CompanyEnum.广发商贸)
|
||
{
|
||
var forwardTrades = yldb.trade.Where(x => tradeIds.Contains(x.id) && x.TradeType == "远期").Select(s => s.id).ToList();
|
||
var forwardTradeCashIds = yldb.trade_cash.Where(l => tradeCashIds.Contains(l.id) && forwardTrades.Contains(l.TradeId)).Select(s => s.id).ToList();
|
||
if (forwardTradeCashIds.Count > 0)
|
||
{
|
||
var _results = new ForwardSettlementBillGenerateService(CurUser).Generate(forwardTradeCashIds, null, docType).ToList();
|
||
results.AddRange(_results);
|
||
}
|
||
tradeCashIds = tradeCashIds.Except(forwardTradeCashIds).ToList();
|
||
if (tradeCashIds.Count > 0)
|
||
{
|
||
var results1 = new SettlementBillGenerateService(CurUser).Generate(tradeCashIds, null, docType, userId ?? CurUser.UserId, userName).ToList();
|
||
results.AddRange(results1);
|
||
}
|
||
errors = results.Where(n => !string.IsNullOrWhiteSpace(n.ErrorMessage)).Select(n => n.ErrorMessage).ToList();
|
||
files = DocFileHelper.CheckResultDocFilePath(results.Select(n => n.OutputFilePath));
|
||
}
|
||
else if (PS.Config.Is物产中大)
|
||
{
|
||
var IsTradeContract = yldb.trade_contract_r.Where(l => l.IsValid && tradeIds.Contains(l.TradeId) && l.Type == "交易确认书").Select(l => l.TradeId).ToList();
|
||
var IsTradeIds = tradeIds.Where(l => !IsTradeContract.Contains(l)).ToList();
|
||
if (IsTradeIds.Count > 0)
|
||
{
|
||
throw new ServiceException(String.Join(",", yldb.trade.Where(l => IsTradeIds.Contains(l.id)).Select(l => l.TradeNumber).ToArray()) + "请生成该交易编号相应交易确认书");
|
||
}
|
||
var query =
|
||
(from tc in yldb.trade_cash.Where(O => tradeCashIds.Contains(O.id) && !O.IsDeleted)
|
||
join t in yldb.trade
|
||
on tc.TradeId equals t.id
|
||
select new
|
||
{
|
||
tc.id,
|
||
tc.ValueDate,
|
||
t.ClientId,
|
||
t.TradeType,
|
||
});
|
||
//通过传入的tradeCashId查出对应的记录;
|
||
|
||
var clientTradeDict =
|
||
query.AsEnumerable().GroupBy(O => new { O.ClientId,O.ValueDate,O.TradeType,})
|
||
.ToDictionary(K => K.Key, V => V.Select(O => O.id).ToList());
|
||
foreach (var trades in clientTradeDict)
|
||
{
|
||
|
||
if (trades.Value.Count>10)
|
||
{
|
||
throw new ServiceException("同客户同日期同类型交易生成超过限制!");
|
||
}
|
||
var result =
|
||
new RDBatchEndBillGenerateService(CurUser)
|
||
.Generate(trades.Value, null, docType, CurUser.UserId, CurUser.UserName).ToList();
|
||
results.AddRange(result);
|
||
|
||
}
|
||
errors.AddRange(results.Where(n => !string.IsNullOrWhiteSpace(n.ErrorMessage)).Select(n => n.ErrorMessage).ToArray());
|
||
|
||
files.AddRange(results.Where(n => !string.IsNullOrWhiteSpace(n.OutputFilePath)).Select(n => n.OutputFilePath).ToList());
|
||
}
|
||
else
|
||
{
|
||
if (PS.Config.Is国泰君安)
|
||
{
|
||
var getUnderlyingInstrumentType = new Func<int, string>((underlyingId) =>
|
||
{
|
||
return DataCacheProvider.GetUnderlyingDataSource().GetData(underlyingId).UnderlyingInstrumentType;
|
||
});
|
||
var error = new List<string>();
|
||
var file = new List<string>();
|
||
var query =
|
||
from t in yldb.trade
|
||
join tc in yldb.trade_cash
|
||
on t.id equals tc.TradeId
|
||
where
|
||
tradeCashIds.Contains(tc.id) &&
|
||
tc.ValidState != ConsGlobal.InValid && !tc.IsDeleted &&
|
||
tc.Action != ClientCashInCashOut.系统操作_期权费
|
||
select new { t.id, t.ClientId, t.UnderlyingInstrumentType, t.UnderlyingId, t.TradeType, TradeCashId = tc.id, ValueDate = tc.HappenedDate ?? tc.ValueDate };
|
||
var instrumentTypeArr = new List<string>() { ConsGlobal.InstrumentType.Stock, ConsGlobal.InstrumentType.StockIF, ConsGlobal.InstrumentType.StockIndex };
|
||
var arr = query.ToList();
|
||
if (arr.Any(O => instrumentTypeArr.Contains(getUnderlyingInstrumentType(O.UnderlyingId)) || O.TradeType == "雪球期权"))
|
||
{
|
||
//暂时将所有子交易都作为判断依据,等拿到模板后再根据模板做调整更改;
|
||
//目前是否为权益类的判断条件只是是否是股票,没有考虑IC IF等品种;
|
||
var count =
|
||
arr.GroupBy(O => new { UnderlyingInstrumentType = (instrumentTypeArr.Contains(getUnderlyingInstrumentType(O.UnderlyingId)) || O.TradeType == "雪球期权") ? 1 : 0 }).Count();
|
||
if (count > 1)
|
||
{
|
||
throw new ServiceException("不应勾选多个非股票(含股指期货)标的的交易");
|
||
}
|
||
var group = query.AsEnumerable().GroupBy(O => new { O.ClientId }).ToDictionary(K => K.Key, V => V.Select(O => O.TradeCashId).ToList());
|
||
foreach (var item in group)
|
||
{
|
||
var trade_contract_r = yldb.trade_contract_r.Where(c => item.Value.Contains(c.TradeCashId.Value) && c.IsValid).ToList();
|
||
//yldb.trade_contract_r.RemoveRange(trade_contract_r);
|
||
trade_contract_r.ForEach(O => O.IsValid = false);
|
||
yldb.SaveChanges();
|
||
|
||
var trades = query.Where(c => item.Value.Contains(c.TradeCashId)).ToList();
|
||
var supProtocolDate = DataCacheProvider.GetClientDataSource().GetData(trades.FirstOrDefault().ClientId).SupProtocolDate;
|
||
var groupDateDouble = trades.Where(x => supProtocolDate == null || x.ValueDate < supProtocolDate).Select(x => x.TradeCashId).ToList();
|
||
var groupDateSingle = trades.Where(x => supProtocolDate != null && x.ValueDate >= supProtocolDate).Select(x => x.TradeCashId).ToList();
|
||
// 单章确认书和双章确认书同时生成要生成两个文件
|
||
if (groupDateDouble.Any() && groupDateSingle.Any())
|
||
{
|
||
var result1 = new RDBatchEndBillGenerateService(CurUser).Generate(groupDateDouble, null, docType, userId ?? CurUser.UserId, userName, startDate, supProtocolDate.Value.AddDays(-1));
|
||
results.AddRange(result1);
|
||
var result2 = new RDBatchEndBillGenerateService(CurUser).Generate(groupDateSingle, null, docType, userId ?? CurUser.UserId, userName, supProtocolDate, endDate);
|
||
results.AddRange(result2);
|
||
}
|
||
else if (groupDateDouble.Any())
|
||
{
|
||
var result = new RDBatchEndBillGenerateService(CurUser).Generate(groupDateDouble, null, docType, userId ?? CurUser.UserId, userName, startDate, endDate);
|
||
results.AddRange(result);
|
||
}
|
||
else if (groupDateSingle.Any())
|
||
{
|
||
var result = new RDBatchEndBillGenerateService(CurUser).Generate(groupDateSingle, null, docType, userId ?? CurUser.UserId, userName, startDate, endDate);
|
||
results.AddRange(result);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
if (results.Count() == 0)
|
||
{
|
||
if (PS.Config.ErpElement.SettlementPageV2)
|
||
{
|
||
var query =
|
||
(from tc in yldb.trade_cash.Where(O => tradeCashIds.Contains(O.id) && !O.IsDeleted)
|
||
join t in yldb.trade
|
||
on tc.TradeId equals t.id
|
||
select new
|
||
{
|
||
tc.id,
|
||
tc.ValueDate,
|
||
t.ClientId,
|
||
tradeid = t.ParentTradeId == 0 ? t.id : t.ParentTradeId,
|
||
t.UnderlyingCode,
|
||
t.TradeType
|
||
})//通过传入的tradeCashId查出对应的记录;
|
||
.Union
|
||
(from pid in (from interTc in yldb.trade_cash.Where(O => tradeCashIds.Contains(O.id) && !O.IsDeleted)
|
||
join interT in yldb.trade
|
||
on interTc.TradeId equals interT.id
|
||
where interT.ParentTradeId != 0
|
||
select new { interT.ParentTradeId, interTc.ValueDate, interTc.Action, interTc.Notional, interTc.UnwindNotional, interTc.ExerciseWay })
|
||
join t in yldb.trade
|
||
on pid.ParentTradeId equals t.ParentTradeId
|
||
join tc in yldb.trade_cash //后期需要更改
|
||
on new { t.id, pid.ValueDate, pid.Action, pid.Notional, pid.UnwindNotional, pid.ExerciseWay } equals new { id = tc.TradeId, tc.ValueDate, tc.Action, tc.Notional, tc.UnwindNotional, tc.ExerciseWay }
|
||
where !tc.IsDeleted
|
||
select new
|
||
{
|
||
tc.id,
|
||
tc.ValueDate,
|
||
t.ClientId,
|
||
tradeid = t.ParentTradeId == 0 ? t.id : t.ParentTradeId,
|
||
t.UnderlyingCode,
|
||
t.TradeType
|
||
}//再通过传入的tradeCashId查出对应的兄弟交易的记录;
|
||
);
|
||
|
||
var clientTradeDict = new Dictionary<string, List<int>>();
|
||
//query.GroupBy(O => O.ClientId + " " + O.ValueDate + " " + O.tradeid)
|
||
//.ToDictionary(K => K.Key, V => V.Select(O => O.id).ToList());
|
||
var list = query.AsEnumerable();
|
||
if (PS.Config.Company == CompanyEnum.润和)
|
||
{
|
||
var notAsignOptionList = list.Where(p => !"亚式期权".Equals(p.TradeType)).ToList();
|
||
if (notAsignOptionList != null && notAsignOptionList.Count > 0)
|
||
{
|
||
clientTradeDict = notAsignOptionList.GroupBy(O => O.ClientId + " " + O.ValueDate)
|
||
.ToDictionary(K => K.Key, V => V.Select(O => O.id).ToList());
|
||
|
||
}
|
||
var asignOptionList = list.Where(p => "亚式期权".Equals(p.TradeType)).ToList();
|
||
if (asignOptionList != null && asignOptionList.Count > 0)
|
||
{
|
||
var asignOptionDic = asignOptionList.GroupBy(O => O.ClientId + " " + O.ValueDate + " " + O.tradeid)
|
||
.ToDictionary(K => K.Key, V => V.Select(O => O.id).ToList());
|
||
foreach (var asignDic in asignOptionDic)
|
||
{
|
||
clientTradeDict.Add(asignDic.Key, asignDic.Value);
|
||
}
|
||
}
|
||
//clientTradeDict =
|
||
//list.GroupBy(O => O.ClientId + " " + O.ValueDate)
|
||
//.ToDictionary(K => K.Key, V => V.Select(O => O.id).ToList());
|
||
}
|
||
else
|
||
{
|
||
clientTradeDict =
|
||
list.GroupBy(O => O.ClientId + " " + O.ValueDate + " " + O.tradeid)
|
||
.ToDictionary(K => K.Key, V => V.Select(O => O.id).ToList());
|
||
}
|
||
foreach (var trades in clientTradeDict)
|
||
{
|
||
var result =
|
||
new RDBatchEndBillGenerateService(CurUser)
|
||
.Generate(trades.Value, null, docType, CurUser.UserId, CurUser.UserName).ToList();
|
||
results.AddRange(result);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
results = new SettlementBillGenerateService(CurUser).Generate(tradeCashIds, null, docType, userId ?? CurUser.UserId, userName).ToList();
|
||
}
|
||
}
|
||
errors = results.Where(n => !string.IsNullOrWhiteSpace(n.ErrorMessage)).Select(n => n.ErrorMessage).ToList();
|
||
files = DocFileHelper.CheckResultDocFilePath(results.Select(n => n.OutputFilePath));
|
||
}
|
||
|
||
if (errors.Any())
|
||
{
|
||
return JsonError(string.Join("\r\n", errors.AsEnumerable()), files);
|
||
}
|
||
return JsonSuccess(PS.GetErpConfig().IsAutoSealAndUploadFiles && PS.GetErpConfig().IsAutoSealAfterGeneratedBook ? "生成成功,用印等待中..." : "生成成功", files);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 生成结算确认书
|
||
/// </summary>
|
||
public JsonResult GJGenerateUnwindReport(List<UnwindReportInputModel> trades, string docType, int? userId, string userName)
|
||
{
|
||
docType = docType.ToLowerInvariant();
|
||
|
||
if ("doc" == docType)
|
||
{
|
||
docType = "docx";
|
||
}
|
||
|
||
var user = new OptUserInfo(userId ?? UserId, userName.TrimToNull() ?? UserName, OptUserFrom.WebUI);
|
||
|
||
if (new TradeContractGenerateService(user).GJGenerateUnwindReport(trades, docType, out var errors, out var files))
|
||
{
|
||
files = DocFileHelper.CheckResultDocFilePath(files);
|
||
return JsonSuccess(PS.GetErpConfig().IsAutoSealAndUploadFiles ? "生成成功,用印等待中..." : "生成成功", files);
|
||
}
|
||
|
||
return JsonError(string.Join("\r\n", errors.AsEnumerable()), files);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 批量发送清算确认书
|
||
/// </summary>
|
||
public JsonResult SendEmailSettleBill(TradeReq req)
|
||
{
|
||
var message = new SettleBillService(CurUser).SendEmailSettleBill(req);
|
||
return JsonSuccess(message);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 国君批量发送清算确认书
|
||
/// </summary>
|
||
public JsonResult SendEmailSettleBill_Guojun(TradeReq req)
|
||
{
|
||
var message = new SettleBillService(CurUser).SendEmailSettleBill_Guojun(req);
|
||
return JsonSuccess(message);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 批量发送提前终止确认书
|
||
/// </summary>
|
||
public JsonResult SendEmailUnwindReport(TradeReq req)
|
||
{
|
||
var message = new UnwindReportService(CurUser).SendEmailUnwindReport(req);
|
||
return JsonSuccess(message);
|
||
}
|
||
/// <summary>
|
||
/// 国君发送提前终止确认书
|
||
/// </summary>
|
||
/// <param name="req"></param>
|
||
/// <returns></returns>
|
||
public JsonResult SendEmailUnwindReportGuojun(TradeReq req)
|
||
{
|
||
var message = new UnwindReportService(CurUser).GuojunSendEmailUnwindReport(req);
|
||
return JsonSuccess(message);
|
||
}
|
||
/// <summary>
|
||
/// 批量发送清算确认书和提前终止确认书
|
||
/// </summary>
|
||
public JsonResult SendEmailEitherReport(TradeReq req)
|
||
{
|
||
var message = new UnwindReportService(CurUser).SendEmailEitherReport(req);
|
||
return JsonSuccess(message);
|
||
}
|
||
|
||
[MyAuthorize("结算管理-到期结算报告")]
|
||
public ActionResult maturityDateReport()
|
||
{
|
||
if (GlobalConfig.SelectConfirmationBookTemplate)
|
||
{
|
||
try
|
||
{
|
||
if (string.IsNullOrWhiteSpace(GlobalConfig.PluginFolder))
|
||
{ throw new Exception("未找到插件路径"); }
|
||
var dirPath = Path.Combine(GlobalConfig.PluginFolder, "App_Docs", ContractTypeEnum.Clearing);
|
||
if (!Directory.Exists(dirPath))
|
||
{
|
||
Directory.CreateDirectory(dirPath);
|
||
}
|
||
var paths = Directory.GetFiles(dirPath, "*.docx");
|
||
for (var i = 0; i < paths.Length; i++)
|
||
{
|
||
paths[i] = Path.GetFileName(paths[i]);
|
||
}
|
||
ViewBag.TemplateNames = paths;
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
LogFactory.GetLogger("SelectConfirmationBookTemplate").Error(ex);
|
||
}
|
||
}
|
||
return View();
|
||
}
|
||
|
||
public JsonResult todayMaturityTradeReportQuery(TradeReq req)
|
||
{
|
||
var systemDate = valuedateBLL.ValueDate;
|
||
var bll = new tradeBLL();
|
||
req.ExerciseDate = req.ExerciseDate ?? systemDate;
|
||
req.ExerciseDateStart = req.ExerciseDateStart ?? DateTime.MinValue;
|
||
req.ExerciseDateEnd = req.ExerciseDateEnd ?? DateTime.MaxValue;
|
||
//req.TradeStatus = ConsTrade.确认成交;
|
||
//req.TradeStatusList = new List<string> { ConsTrade.已到期, ConsTrade.已执行, ConsTrade.已平仓 };
|
||
req.TradeStatusList = new List<string> { ConsTrade.已到期, ConsTrade.已执行 };
|
||
if (PS.Config.ComponentVersion != ComponentVersion.MarketMaker)
|
||
{//非国君都设置为到期结算报告包括平仓交易
|
||
req.TradeStatusList.Add(ConsTrade.已平仓);
|
||
req.TradeStatusList.Add(ConsTrade.确认成交);
|
||
}
|
||
if (req.TradeTypes == null)
|
||
{
|
||
List<string> types = new List<string>(ConsTrade.OptionTradeTypes);
|
||
if (PS.Config.Is渤海 || PS.Config.Company == CompanyEnum.广发商贸)
|
||
{
|
||
types.Add("远期");
|
||
}
|
||
|
||
//默认只查询期权类交易
|
||
req.TradeTypes = string.Join(",", types);
|
||
}
|
||
req.AssetIdList = AssetUnitModel.IntersectAssetUnits(req.AssetIdGroupList, req.AssetIdList).ToList();
|
||
req.UserAssets = CurUser.GetAssetUnitIds();
|
||
req.UserClients = CurUser.GetClientIdsByCurUser(CurUser.交易管理_查看所有交易);
|
||
req.CurUserTradeIds = CurUser.GetTradeIdsByCurUser();
|
||
var sList = bll.SearchTradeWithCashList(req, out var gsum, false);
|
||
var rowList = sList.rows;
|
||
|
||
new TradeDalService(CurUser).SetStructureInfo(rowList.Select(x => x.trade).ToList());
|
||
|
||
//增加交易确认书编号
|
||
if (rowList != null && rowList.Any())
|
||
{
|
||
|
||
db.SetDebugLog();
|
||
var tradeCashIds = rowList.Select(x => x.trade_cash.id).ToList();
|
||
var tradeContractCodeList = (from tradeContractR in db.trade_contract_r
|
||
join tradeContractDoc in (from tradeContractDocTemp in db.trade_contract_document where tradeContractDocTemp.Type == ContractTypeEnum.Clearing || tradeContractDocTemp.Type == ContractTypeEnum.UnWind select tradeContractDocTemp)
|
||
on tradeContractR.ContractCode equals tradeContractDoc.Code into tradeContractDoc1
|
||
from tradeContractDoc2 in tradeContractDoc1.DefaultIfEmpty()
|
||
where tradeCashIds.Contains(tradeContractR.TradeCashId ?? 0) && (tradeContractR.Type == ContractTypeEnum.Clearing || tradeContractR.Type == ContractTypeEnum.UnWind) && tradeContractR.IsValid
|
||
|
||
select new
|
||
{
|
||
tradeContractR.TradeCashId,
|
||
tradeContractR.ContractCode,
|
||
tradeContractDoc = tradeContractDoc2
|
||
}).ToList();
|
||
|
||
foreach (var trade in rowList)
|
||
{
|
||
if (trade.trade.TradeType == "合成价差期权")
|
||
{
|
||
trade.trade.SyntheticUnderlyingTipsInfo = synthetic_underlyingBLL.GetUnderlyingTipsInfo(trade.trade.UnderlyingCode);
|
||
}
|
||
var tradeContractinfo = tradeContractCodeList.FirstOrDefault(t => t.TradeCashId == trade.trade_cash.id);
|
||
if (tradeContractinfo != null)
|
||
{
|
||
trade.ContractCode = tradeContractinfo.ContractCode;
|
||
if (null != tradeContractinfo.tradeContractDoc)
|
||
{
|
||
var sealResult = tradeContractinfo.tradeContractDoc.SealResult;
|
||
trade.ContractDocUrl = tradeContractinfo.tradeContractDoc.RelativePath;
|
||
trade.trade_contract_document = tradeContractinfo.tradeContractDoc;
|
||
|
||
trade.SealResult = sealResult != null ? Enum.GetName(typeof(SealResultEnum), sealResult) : "";
|
||
|
||
trade.SealTime = tradeContractinfo.tradeContractDoc.SealResult == (int)SealResultEnum.成功 ? tradeContractinfo.tradeContractDoc.OptDate.Value.ToString("yyyy-MM-dd HH:mm:ss") : "";
|
||
}
|
||
}
|
||
trade.CountRatio = Modules.DataCacheModule.DataCacheManager.GetUnderlyingDataSource().GetData(trade.trade.UnderlyingCode).CountRatio;
|
||
}
|
||
}
|
||
|
||
return Json(sList);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 包括提前确认书和到期结算书
|
||
/// </summary>
|
||
public JsonResult EitherEndTradeReportQuery(TradeReq req)
|
||
{
|
||
req.OptDateStart = valuedateBLL.ValueDate;
|
||
req.OptDateEnd = valuedateBLL.ValueDate;
|
||
|
||
if (!string.IsNullOrWhiteSpace(req.TradeStatus))
|
||
{
|
||
req.TradeStatusList = req.TradeStatus.Split(new[] { ',' }).ToList();
|
||
}
|
||
req.AssetIdList = AssetUnitModel.IntersectAssetUnits(req.AssetIdGroupList, req.AssetIdList).ToList();
|
||
req.UserAssets = CurUser.GetAssetUnitIds();
|
||
req.UserClients = CurUser.GetClientIdsByCurUser(CurUser.交易管理_查看所有交易);
|
||
req.CurUserTradeIds = CurUser.GetTradeIdsByCurUser();
|
||
var sList = new tradeBLL().SearchEitherTradeWithCashList(req, out var gsum);
|
||
foreach (var r in sList.rows)
|
||
{
|
||
if (r.trade.TradeType == "合成价差期权")
|
||
{
|
||
r.trade.SyntheticUnderlyingTipsInfo = synthetic_underlyingBLL.GetUnderlyingTipsInfo(r.trade.UnderlyingCode);
|
||
}
|
||
}
|
||
|
||
return Json(sList);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 批量下载结算确认书
|
||
/// </summary>
|
||
public async Task<ActionResult> BatchDownLoadDoc(DownloadDocReq req)
|
||
{
|
||
if (req.docpdf == null)
|
||
{
|
||
return ShowError("请选择文档类型!");
|
||
}
|
||
if (string.IsNullOrWhiteSpace(req.docpdf[0]))
|
||
{
|
||
return ShowError("请选择文档类型!");
|
||
}
|
||
|
||
var documentQuery = TradeConfirmationDocumentQuery.Create(
|
||
yldb.trade_contract_document,
|
||
yldb.trade_contract_r,
|
||
yldb.trade,
|
||
req.TradeDateStart,
|
||
req.TradeDateEnd);
|
||
|
||
var query = from item in documentQuery
|
||
let doc = item.Document
|
||
let r = item.Relation
|
||
where doc.Type == ContractTypeEnum.Trade
|
||
select new
|
||
{
|
||
doc.ClientId,
|
||
doc.Paths,
|
||
TradeCashId = r.TradeCashId ?? 0,
|
||
r.Type,
|
||
r.TradeId,
|
||
r.TradeNumber,
|
||
r.ContractCode,
|
||
doc.SealResult,
|
||
doc.StampDocumentFileName,
|
||
doc.EncryptId,
|
||
doc.Comments,
|
||
doc.FileName
|
||
};
|
||
|
||
var isSelect = false;
|
||
if (req.TradeIds != null && req.TradeIds.Any(O => O != 0))
|
||
{
|
||
isSelect = true;
|
||
query = query.Where(O => req.TradeIds.Contains(O.TradeId));
|
||
}
|
||
if (req.TradeCashIds != null && req.TradeCashIds.Any(O => O != 0))
|
||
{
|
||
isSelect = true;
|
||
query = query.Where(O => req.TradeCashIds.Contains(O.TradeCashId));
|
||
}
|
||
if (req.ContractCodes != null && req.ContractCodes.Any(O => !string.IsNullOrWhiteSpace(O)))
|
||
{
|
||
isSelect = true;
|
||
query = query.Where(O => req.ContractCodes.Contains(O.ContractCode));
|
||
}
|
||
if (req.DocType != null)
|
||
{
|
||
query = query.Where(O => O.Type == req.DocType);
|
||
}
|
||
if (!isSelect && !req.TradeNumber.IsNullOrWhiteSpace())
|
||
{
|
||
query = query.Where(O => O.TradeNumber == req.TradeNumber);
|
||
}
|
||
if (!isSelect && !req.ContractCode.IsNullOrWhiteSpace())
|
||
{
|
||
query = query.Where(O => O.ContractCode == req.ContractCode);
|
||
}
|
||
if (!isSelect && req.ClientIds != null && req.ClientIds.Any(O => O != 0))
|
||
{
|
||
query = query.Where(O => req.ClientIds.Contains(O.ClientId ?? 0));
|
||
}
|
||
if (req.SealResults != null && req.SealResults.Count > 0)
|
||
{
|
||
if (req.SealResults.Contains(2))
|
||
{
|
||
query = query.Where(t => req.SealResults.Contains((int)t.SealResult) || t.SealResult == null);
|
||
}
|
||
else
|
||
{
|
||
query = query.Where(t => req.SealResults.Contains((int)t.SealResult));
|
||
}
|
||
}
|
||
|
||
var datas = query.ToList();
|
||
|
||
if (datas.Count == 0)
|
||
{
|
||
return ShowError("未找到确认书文件,请确认筛选条件是否有效!");
|
||
}
|
||
|
||
datas = datas.DistinctBy(O => O.ContractCode).ToList();
|
||
|
||
var filePathList = new List<string>(datas.Count * req.docpdf.Count());
|
||
|
||
var contractBLL = new TradeContractBLL(CurUser);
|
||
|
||
var comfirmService = new ConfirmationGenerateService(OptUserInfo.SystemUser);
|
||
|
||
foreach (var item in datas)
|
||
{
|
||
var path = item.Paths;
|
||
foreach (var type in req.docpdf)
|
||
{
|
||
var doc = contractBLL.GetContractDoc(item.TradeId, item.Type, item.TradeCashId);
|
||
if (req.IsSeal)
|
||
{
|
||
if (string.IsNullOrWhiteSpace(item.StampDocumentFileName))
|
||
{
|
||
if (PS.GetErpConfig().IsAutoSealAndUploadFiles &&
|
||
PS.GetErpConfig().IsAutoSealAfterGeneratedBook)
|
||
{
|
||
var (flag, result, fileBytesStr) = await GlobalConfig.SealHandler.UploadApiAsync(doc, PS.GetErpConfig().SealKeyWord);
|
||
|
||
if (!flag)
|
||
{
|
||
_logger.Error($"交易编号:{item.TradeId}用印失败:{result}");
|
||
|
||
GlobalConfig.SealHandler.SaveTradeAuditLog(item.TradeId, result, "用印失败", DateTime.Now);
|
||
//SaveTradeAuditLog("", DateTime.Now.ToString("yyyy-MM-dd hh:MM:ss"), "失败", excelFileName, msg);
|
||
GlobalConfig.SealHandler.UpdateTradeContractDocument(doc, (int)SealResultEnum.失败, result);
|
||
|
||
return ShowError($"交易编号:{item.TradeNumber}用印失败,请重新操作!");
|
||
}
|
||
else
|
||
{
|
||
//上传
|
||
var ms = new MemoryStream();
|
||
if (!string.IsNullOrWhiteSpace(fileBytesStr))
|
||
{
|
||
var fileBytes = Convert.FromBase64String(fileBytesStr);
|
||
|
||
ms.Write(fileBytes, 0, fileBytes.Length);
|
||
}
|
||
|
||
var (flag2, msg, optDate, stampPath) = comfirmService.UploadContractFile(item.EncryptId, item.Comments, item.ContractCode, true, false, new UploadFileModel
|
||
{
|
||
Length = ms.Length,
|
||
ContentType = "application/pdf",
|
||
FileName = item.FileName,
|
||
OpenReadStream = () => ms
|
||
});
|
||
|
||
if (flag2)
|
||
{
|
||
_logger.Info($"交易编号:{item.TradeId}用印文件上传成功");
|
||
|
||
GlobalConfig.SealHandler.SaveTradeAuditLog(item.TradeId, result, "用印成功", optDate);
|
||
GlobalConfig.SealHandler.UpdateTradeContractDocument(doc, (int)SealResultEnum.成功, result);
|
||
|
||
path = stampPath;
|
||
}
|
||
else
|
||
{
|
||
_logger.Error($"交易编号:{item.TradeId}用印文件上传失败:{msg}");
|
||
GlobalConfig.SealHandler.SaveTradeAuditLog(item.TradeId, result, "用印失败", optDate);
|
||
GlobalConfig.SealHandler.UpdateTradeContractDocument(doc, (int)SealResultEnum.失败, msg);
|
||
|
||
return ShowError($"交易编号:{item.TradeNumber}用印失败,请重新操作![错误信息:{msg}]");
|
||
}
|
||
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return ShowError("存在未用印的文件,用印后再下载文件!");
|
||
}
|
||
|
||
}
|
||
else
|
||
{
|
||
path = item.StampDocumentFileName;
|
||
var extention = Path.GetExtension(path);
|
||
var innerfName = GetFileName(path, extention);
|
||
filePathList.Add(innerfName);
|
||
break;//如果是下载已用印的文件只需要下载用印后的文件就行了;
|
||
|
||
}
|
||
}
|
||
|
||
|
||
var fName = GetFileName(type == "PDF" ? path : item.Paths, type.ToLower());
|
||
if (string.IsNullOrEmpty(fName))
|
||
{
|
||
fName = GetFileName(type == "PDF" ? path : item.Paths, ".xls");
|
||
}
|
||
if (!string.IsNullOrEmpty(fName))
|
||
{
|
||
filePathList.Add(fName);
|
||
}
|
||
|
||
}
|
||
}
|
||
|
||
if (filePathList.Count == 0)
|
||
{
|
||
return ShowError("未找到确认书文件,请确认确认书已成功生成!");
|
||
}
|
||
|
||
var fileName = $"确认书文件{DateTime.Now:yyyyMMddHHmmss}.zip";
|
||
ZipHelper.zipFiles(filePathList.Distinct().ToArray(), filePathList[0], out var buffer);
|
||
return File(buffer, "application/zip", fileName);
|
||
}
|
||
|
||
private string GetFileName(string baseName, string sufferFix)
|
||
{
|
||
var fName = Path.ChangeExtension(baseName, sufferFix);
|
||
|
||
if (!string.IsNullOrWhiteSpace(fName) && (fName[0] != '/' || fName[0] != '\\'))
|
||
{
|
||
fName = fName.Insert(0, "/");
|
||
}
|
||
|
||
fName = OtcAppContext.MapPath(fName);
|
||
|
||
if (!System.IO.File.Exists(fName))
|
||
{ fName += "x"; }//解决数据库中存的后缀名是doc但实际文件是docx的问题;
|
||
if (System.IO.File.Exists(fName))
|
||
{ return fName; }
|
||
else
|
||
{ return null; }
|
||
}
|
||
|
||
[MyAuthorize("交易管理-到期修改")]
|
||
public ActionResult EditMaturityDate(string enid)
|
||
{
|
||
if (enid.IsNullOrWhiteSpace())
|
||
{
|
||
return JsonError("请输入参数enid");
|
||
}
|
||
var intid = DataProtectHelper.DecryptInt(enid);
|
||
var td = db.trade.Find(intid);
|
||
if (td == null || td.ValidState == ConsGlobal.InValid)
|
||
{
|
||
return JsonError("系统中没有相关的交易");
|
||
}
|
||
if (!td.CanEditMaturityDate())
|
||
{
|
||
return JsonError("该交易不能执行到期修改操作");
|
||
}
|
||
if (td.TradeStatus != ConsTrade.已到期 && td.TradeStatus != ConsTrade.已执行)
|
||
{
|
||
return JsonError("只有状态为已到期或已执行的交易可以完成此操作");
|
||
}
|
||
new TradeBackService(CurUser).Execute(intid, true, TradeBackActionEnum.EditMaturityDate);
|
||
return JsonSuccess("到期修改成功");
|
||
}
|
||
|
||
[MyAuthorize("交易管理-交易平仓")]
|
||
public ActionResult TerminationBackToConfirmed(string enid)
|
||
{
|
||
if (enid.IsNullOrWhiteSpace())
|
||
{
|
||
return JsonError("请输入参数enid");
|
||
}
|
||
var tradeId = DataProtectHelper.DecryptInt(enid);
|
||
new TradeConfirmService(CurUser).TerminationBackToConfirmed(tradeId);
|
||
return JsonSuccess("提前终止放弃成功");
|
||
}
|
||
|
||
[MyAuthorize("结算管理-交易明细")]
|
||
public ActionResult TradeDetails(TradeDetailsViewModel model)
|
||
{
|
||
var valueDate = valuedateBLL.ValueDate;
|
||
|
||
if (model == null)
|
||
{
|
||
model = new TradeDetailsViewModel();
|
||
}
|
||
|
||
model.ValueDate = valueDate.ToString("yyyy-MM-dd");
|
||
|
||
if (string.IsNullOrWhiteSpace(model.EndDate))
|
||
{
|
||
model.EndDate = model.ValueDate;
|
||
}
|
||
|
||
if (string.IsNullOrWhiteSpace(model.DetailStatus))
|
||
{
|
||
model.DetailStatus = "成交";
|
||
}
|
||
|
||
if (model.TradeTypes == null)
|
||
{
|
||
model.TradeTypes = Array.Empty<string>();
|
||
}
|
||
|
||
model.CCEmail = DBCacheManager.Single.GetStr(CacheTable.CCEmail) ?? string.Empty;
|
||
|
||
return View(model);
|
||
}
|
||
|
||
[MyAuthorize("结算管理-交易明细")]
|
||
public ActionResult QueryTradeDetails(TradeDetailsReq req)
|
||
{
|
||
if (ConsUserGroup.HasGroup && !ShowAllTrades)
|
||
{
|
||
req.UserAssetUnits = GetUserAssetunitIds();
|
||
}
|
||
var resultList = new TradeDetailsQueryService(CurUser).SearchTradeDetails(req);
|
||
return Json(resultList);
|
||
}
|
||
|
||
[MyAuthorize("结算管理-交易明细")]
|
||
public ActionResult QueryGroupTradeDetails(TradeDetailsReq req)
|
||
{
|
||
req.rows = 100000;
|
||
req.page = 1;
|
||
|
||
var resultList = new TradeDetailsQueryService(CurUser).SearchTradeDetails(req, req.GroupTradeId).rows;
|
||
return Json(resultList);
|
||
}
|
||
|
||
[MyAuthorize("结算管理-互换明细")]
|
||
public ActionResult TradeDetailsSwap(TradeDetailsViewModel model)
|
||
{
|
||
var valueDate = valuedateBLL.ValueDate;
|
||
|
||
if (model == null)
|
||
{
|
||
model = new TradeDetailsViewModel();
|
||
}
|
||
|
||
model.ValueDate = valueDate.ToString("yyyy-MM-dd");
|
||
|
||
if (string.IsNullOrWhiteSpace(model.EndDate))
|
||
{
|
||
model.EndDate = model.ValueDate;
|
||
}
|
||
|
||
if (string.IsNullOrWhiteSpace(model.DetailStatus))
|
||
{
|
||
model.DetailStatus = "成交";
|
||
}
|
||
|
||
if (model.TradeTypes == null)
|
||
{
|
||
model.TradeTypes = Array.Empty<string>();
|
||
}
|
||
|
||
model.CCEmail = DBCacheManager.Single.GetStr(CacheTable.SwapCCEmail) ?? string.Empty;
|
||
|
||
return View(model);
|
||
}
|
||
|
||
[MyAuthorize("结算管理-互换明细")]
|
||
public ActionResult QueryTradeDetailsSwap(TradeDetailsReq req)
|
||
{
|
||
if (ConsUserGroup.HasGroup && !ShowAllTrades)
|
||
{
|
||
req.UserAssetUnits = GetUserAssetunitIds();
|
||
}
|
||
var resultList = new TradeSwapDetailsQueryService(CurUser).SearchFlowMoreDetails(req);
|
||
return Json(resultList);
|
||
}
|
||
|
||
#region 读删获取交易明细报告模板
|
||
public static List<SelectListItem> GetAllTradeDetailTemplate()
|
||
{
|
||
var names = DBCacheManager.Single.GetTemplateNames("交易明细");
|
||
return names.Select(o => new SelectListItem
|
||
{
|
||
Text = o,
|
||
Value = o
|
||
}).ToList();
|
||
}
|
||
|
||
public JsonResult GetTradeDetailTemplate(string template = "默认")
|
||
{
|
||
var data = new
|
||
{
|
||
CCEmail = DBCacheManager.Single.GetStr(CacheTable.CCEmail, template),
|
||
TradeDetailsBiaoTou = DBCacheManager.Single.GetStr(CacheTable.TradeDetailsBiaoTou, template),
|
||
TradeDetailsBiaoWei = DBCacheManager.Single.GetStr(CacheTable.TradeDetailsBiaoWei, template),
|
||
TradeDetailsLuoKuan = DBCacheManager.Single.GetStr(CacheTable.TradeDetailsLuoKuan, template),
|
||
TradeDetailsSendUser = DBCacheManager.Single.GetStr(CacheTable.TradeDetailsSendUser, template),
|
||
TradeDetailsNeedAppendix = DBCacheManager.Single.GetStr(CacheTable.TradeDerailsNeedAppendix, template)
|
||
};
|
||
return Json(data);
|
||
}
|
||
|
||
public JsonResult removeTemplate(string template)
|
||
{
|
||
DBCacheManager.Single.RemoveTemplate("交易明细", template);
|
||
return JsonSuccess("删除成功");
|
||
}
|
||
|
||
public ActionResult ChooseReportTemplate(int clientId = 0, bool isMail = true, bool isSwap = false)
|
||
{
|
||
ViewBag.isSwap = isSwap;
|
||
if (!isMail)
|
||
{
|
||
return View();
|
||
}
|
||
var ret = getClientDutys(new List<int>() { clientId });
|
||
return View(ret);
|
||
}
|
||
|
||
public JsonResult GetContractTypes(List<int> clientIds)
|
||
{
|
||
var ret = getClientDutys(clientIds);
|
||
return Json(ret);
|
||
}
|
||
|
||
public List<SelectListItem> getClientDutys(List<int> clientIds)
|
||
{
|
||
var clientContacts = clientDB.clientduty.Where(x => x.ApprovalOrder < 1 && x.IsReceiveEmail.HasValue && x.IsReceiveEmail == 1).ToList();
|
||
if (clientIds != null && clientIds.Count() > 0)
|
||
{
|
||
clientContacts = clientContacts.Where(o => clientIds.Contains(o.ClientId ?? 0)).ToList();
|
||
}
|
||
var dutyIds = new List<int>();
|
||
var duty = new Dictionary<int, string>();
|
||
var contantType = clientDB.contactype.ToList();
|
||
foreach (var item in clientContacts)
|
||
{
|
||
if (!string.IsNullOrWhiteSpace(item.ContactTypeId))
|
||
{
|
||
var ids = item.ContactTypeId.Split(',').Select(o => int.Parse(o));
|
||
dutyIds.AddRange(ids);
|
||
}
|
||
}
|
||
dutyIds = dutyIds.Distinct().ToList();
|
||
foreach (var id in dutyIds)
|
||
{
|
||
var type = contantType.FirstOrDefault(s => s.id == id).ContactType;
|
||
duty.Add(id, type);
|
||
}
|
||
var ret = duty.Select(o => new SelectListItem
|
||
{
|
||
Text = o.Value,
|
||
Value = o.Key.ToString()
|
||
}).ToList();
|
||
return ret;
|
||
}
|
||
#endregion
|
||
|
||
#region 读删获取互换明细报告模板
|
||
|
||
public static List<SelectListItem> GetAllTradeSwapDetailTemplate()
|
||
{
|
||
var names = DBCacheManager.Single.GetTemplateNames("互换明细");
|
||
return names.Select(o => new SelectListItem
|
||
{
|
||
Text = o,
|
||
Value = o
|
||
}).ToList();
|
||
}
|
||
|
||
public JsonResult GetTradeSwapDetailTemplate(string template = "默认")
|
||
{
|
||
var data = new
|
||
{
|
||
CCEmail = DBCacheManager.Single.GetStr(CacheTable.SwapCCEmail, template),
|
||
TradeDetailsBiaoTou = DBCacheManager.Single.GetStr(CacheTable.TradeSwapDetailsBiaoTou, template),
|
||
TradeDetailsBiaoWei = DBCacheManager.Single.GetStr(CacheTable.TradeSwapDetailsBiaoWei, template),
|
||
TradeDetailsLuoKuan = DBCacheManager.Single.GetStr(CacheTable.TradeSwapDetailsLuoKuan, template),
|
||
TradeDetailsSendUser = DBCacheManager.Single.GetStr(CacheTable.TradeSwapDetailsSendUser, template),
|
||
TradeDetailsNeedAppendix = DBCacheManager.Single.GetStr(CacheTable.TradeSwapDerailsNeedAppendix, template)
|
||
};
|
||
return Json(data);
|
||
}
|
||
|
||
public JsonResult removeSwapTemplate(string template)
|
||
{
|
||
DBCacheManager.Single.RemoveTemplate("互换明细", template);
|
||
return JsonSuccess("删除成功");
|
||
}
|
||
|
||
#endregion
|
||
|
||
//[ValidateInput(false)]
|
||
[MyAuthorize("结算管理-交易明细")]
|
||
public JsonResult SaveTradeDetailDesc(string biaoTou, string biaoWei, string luoKuan, string ccemail, string sendUser, string appendixType, string template = "默认")
|
||
{
|
||
SaveDescCache(CacheTable.TradeDetailsBiaoTou, biaoTou, template);
|
||
SaveDescCache(CacheTable.TradeDetailsBiaoWei, biaoWei, template);
|
||
SaveDescCache(CacheTable.TradeDetailsLuoKuan, luoKuan, template);
|
||
SaveDescCache(CacheTable.TradeDetailsSendUser, sendUser, template);
|
||
SaveDescCache(CacheTable.TradeDerailsNeedAppendix, appendixType, template);
|
||
|
||
|
||
if (!string.IsNullOrWhiteSpace(ccemail) && !Regex.IsMatch(ccemail, "^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]+)*\\.[a-zA-Z0-9]{2,6}$"))
|
||
{
|
||
return JsonError("邮件CC地址 保存失败! 邮件地址必须符合正确格式!");
|
||
}
|
||
else
|
||
{
|
||
SaveDescCache(CacheTable.CCEmail, ccemail, template);
|
||
return JsonSuccess("保存交易详细说明成功");
|
||
}
|
||
}
|
||
|
||
//[ValidateInput(false)]
|
||
[MyAuthorize("结算管理-互换明细")]
|
||
public JsonResult SaveTradeSwapDetailDesc(string biaoTou, string biaoWei, string luoKuan, string ccemail, string sendUser, string appendixType, string template = "默认")
|
||
{
|
||
SaveDescCache(CacheTable.TradeSwapDetailsBiaoTou, biaoTou, template);
|
||
SaveDescCache(CacheTable.TradeSwapDetailsBiaoWei, biaoWei, template);
|
||
SaveDescCache(CacheTable.TradeSwapDetailsLuoKuan, luoKuan, template);
|
||
SaveDescCache(CacheTable.TradeSwapDetailsSendUser, sendUser, template);
|
||
SaveDescCache(CacheTable.TradeSwapDerailsNeedAppendix, appendixType, template);
|
||
|
||
|
||
if (!string.IsNullOrWhiteSpace(ccemail) && !Regex.IsMatch(ccemail, "^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]+)*\\.[a-zA-Z0-9]{2,6}$"))
|
||
{
|
||
return JsonError("邮件CC地址 保存失败! 邮件地址必须符合正确格式!");
|
||
}
|
||
else
|
||
{
|
||
SaveDescCache(CacheTable.SwapCCEmail, ccemail, template);
|
||
return JsonSuccess("保存交易详细说明成功");
|
||
}
|
||
}
|
||
|
||
private void SaveDescCache(string key, string content, string template = "默认")
|
||
{
|
||
if (!DBCacheManager.Single.IsSet(key))
|
||
{
|
||
DBCacheManager.Single.Set(key, content, 1000000000);
|
||
return;
|
||
}
|
||
|
||
DBCacheManager.Single.UpdateObj(key, content, template);
|
||
}
|
||
|
||
[MyAuthorize("结算管理-交易明细")]
|
||
public ViewResult TradeDetailsDescSet()
|
||
{
|
||
ViewBag.BiaoTou = DBCacheManager.Single.GetStr(CacheTable.TradeDetailsBiaoTou);
|
||
ViewBag.BiaoWei = DBCacheManager.Single.GetStr(CacheTable.TradeDetailsBiaoWei);
|
||
ViewBag.LuoKuan = DBCacheManager.Single.GetStr(CacheTable.TradeDetailsLuoKuan);
|
||
ViewBag.CCEmail = DBCacheManager.Single.GetStr(CacheTable.CCEmail);
|
||
ViewBag.TradeDetailsSendUser = DBCacheManager.Single.GetStr(CacheTable.TradeDetailsSendUser);
|
||
return View();
|
||
}
|
||
|
||
[MyAuthorize("结算管理-互换明细")]
|
||
public ViewResult TradeSwapDetailsDescSet()
|
||
{
|
||
ViewBag.BiaoTou = DBCacheManager.Single.GetStr(CacheTable.TradeSwapDetailsBiaoTou);
|
||
ViewBag.BiaoWei = DBCacheManager.Single.GetStr(CacheTable.TradeSwapDetailsBiaoWei);
|
||
ViewBag.LuoKuan = DBCacheManager.Single.GetStr(CacheTable.TradeSwapDetailsLuoKuan);
|
||
ViewBag.CCEmail = DBCacheManager.Single.GetStr(CacheTable.SwapCCEmail);
|
||
ViewBag.TradeDetailsSendUser = DBCacheManager.Single.GetStr(CacheTable.TradeSwapDetailsSendUser);
|
||
return View();
|
||
}
|
||
|
||
[MyAuthorize("风险控制-实时持仓风险")]
|
||
public ViewResult realtimePositionRisks()
|
||
{
|
||
return View();
|
||
}
|
||
|
||
[MyAuthorize("风险控制-实时持仓风险")]
|
||
public JsonResult realtimePositionRisksQuery(RealTimePositionRisksReq req)
|
||
{
|
||
req.BookIds = AssetUnitModel.IntersectAssetUnits(req.AssetIdGroupList, req.BookIds).ToList();
|
||
req.UserAssets = CurUser.GetAssetUnitIds();
|
||
req.UserClients = CurUser.GetClientIdsByCurUser(CurUser.交易管理_查看所有交易);
|
||
req.CurUserTradeIds = CurUser.GetTradeIdsByCurUser();
|
||
var result = new RealtimePositionRisksQueryService(CurUser).SearchList(req);
|
||
return Json(result);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 实时持仓风险导出
|
||
/// </summary>
|
||
[MyAuthorize("风险控制-实时持仓风险")]
|
||
public ActionResult DownloadRealTimePositionRisks(RealTimePositionRisksReq req)
|
||
{
|
||
try
|
||
{
|
||
req.BookIds = AssetUnitModel.IntersectAssetUnits(req.AssetIdGroupList, req.BookIds).ToList();
|
||
req.UserAssets = CurUser.GetAssetUnitIds();
|
||
req.UserClients = CurUser.GetClientIdsByCurUser(CurUser.交易管理_查看所有交易);
|
||
|
||
var bytes = new RealtimePositionRisksQueryService(CurUser).ExportRealtimePositionRisksToExcel(req);
|
||
return File(bytes, xlsxMimeType, $"实时-{valuedateBLL.ValueDate:yyyy-MM-dd}.xlsx");
|
||
}
|
||
catch (Exception e)
|
||
{
|
||
return ShowError("导出失败" + e.Message);
|
||
}
|
||
}
|
||
|
||
[MyAuthorize("风险控制-日终持仓风险")]
|
||
public ViewResult EodPositionRisks()
|
||
{
|
||
ViewBag.lastDate_eod = EodOperationBase.GetLastSettlementDate(valuedateBLL.ValueDate);
|
||
ViewBag.lastDate_settle = EodOperationBase.GetLastSettlementDate_Settle();
|
||
return View();
|
||
}
|
||
|
||
[MyAuthorize("风险控制-日终持仓风险")]
|
||
public JsonResult EodPositionRisksQuery(EodPositionRisksReq req)
|
||
{
|
||
req.BookIds = AssetUnitModel.IntersectAssetUnits(req.AssetIdGroupList, req.BookIds).ToList();
|
||
req.UserAssets = CurUser.GetAssetUnitIds();
|
||
req.UserClients = CurUser.GetClientIdsByCurUser(CurUser.交易管理_查看所有交易);
|
||
if (CurUser.交易管理_查看所有交易) { req.UserClients.Clear(); }
|
||
var result = new EodPositionRisksQueryService(CurUser).SearchList(req);
|
||
return Json(result);
|
||
}
|
||
|
||
public object ExportEodRiskReport(DateTime exportDate, double todayHedgeCashInOut = 0)
|
||
{
|
||
try
|
||
{
|
||
var req = new EodPositionRisksReq
|
||
{
|
||
page = 0,
|
||
rows = 10000,
|
||
ValueDate = exportDate,
|
||
IsOnlyExport = true,
|
||
VolType = "持仓",
|
||
EodSettlePriceMode = "收盘价",
|
||
needSettleData = true
|
||
};
|
||
req.BookIds = AssetUnitModel.IntersectAssetUnits(req.AssetIdGroupList, req.BookIds).ToList();
|
||
var bytes = new EodPositionRisksQueryService(CurUser).ExportEodRiskReport(req, todayHedgeCashInOut);
|
||
return File(bytes, xlsxMimeType, $"场外风控结算单-{req.ValueDate:yyyy-MM-dd}.xlsx");
|
||
}
|
||
catch (Exception e)
|
||
{
|
||
return ShowError("导出失败" + e.Message);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 场外成交记录-导出奇异要素
|
||
/// </summary>
|
||
public object DownloadTradeQueryMultiFactors(TradeReq req, string VolType)
|
||
{
|
||
req.AssetIdList = AssetUnitModel.IntersectAssetUnits(req.AssetIdGroupList, req.AssetIdList).ToList();
|
||
req.UserAssets = CurUser.GetAssetUnitIds();
|
||
req.UserClients = CurUser.GetClientIdsByCurUser(CurUser.交易管理_查看所有交易);
|
||
req.CurUserTradeIds = CurUser.GetTradeIdsByCurUser();
|
||
var bytes = new OtcTradeListExportService(CurUser).ExportOptionTradeListToExcel(req, new TradeQueryRequest
|
||
{
|
||
ShowAllTrades = ShowAllTrades,
|
||
UserAssetUnits = ShowAllTrades ? null : GetUserAssetunitIds(),
|
||
VolType = VolType
|
||
}, CurUser.HasRight("交易管理-交易标签查看权限"));
|
||
|
||
|
||
|
||
var fileName = $"场外期权成交记录-{DateTime.Now:yyyy-MM-dd}.xlsx";
|
||
if (PS.Config.Company == Configuration.CompanyEnum.海通)
|
||
{
|
||
//成交
|
||
if ((req.TradeDateStart != DateTime.MinValue || req.TradeDateEnd != DateTime.MinValue)
|
||
&& req.ExerciseDateStart == null && req.ExerciseDateEnd == null
|
||
&& req.UnWindDateStart == null && req.UnWindDateEnd == null)
|
||
{
|
||
fileName = $"成交_{(req.TradeDateStart != DateTime.MinValue ? req.TradeDateStart.ToString("yyyy-MM-dd") : "")}_{(req.TradeDateEnd != DateTime.MinValue ? req.TradeDateEnd.ToString("yyyy-MM-dd") : "")}.xlsx";
|
||
}
|
||
//到期
|
||
else if (req.TradeDateStart == DateTime.MinValue && req.TradeDateEnd == DateTime.MinValue
|
||
&& (req.ExerciseDateStart != null || req.ExerciseDateEnd != null)
|
||
&& req.UnWindDateStart == null && req.UnWindDateEnd == null)
|
||
{
|
||
fileName = $"到期_{(req.ExerciseDateStart != null ? req.ExerciseDateStart.Value.ToString("yyyy-MM-dd") : "")}_{(req.ExerciseDateEnd != null ? req.ExerciseDateEnd.Value.ToString("yyyy-MM-dd") : "")}.xlsx";
|
||
}
|
||
//了结
|
||
else if (req.TradeDateStart == DateTime.MinValue && req.TradeDateEnd == DateTime.MinValue
|
||
&& req.ExerciseDateStart == null && req.ExerciseDateEnd == null
|
||
&& (req.UnWindDateStart != null || req.UnWindDateEnd != null))
|
||
{
|
||
fileName = $"了结_{(req.UnWindDateStart != null ? req.UnWindDateStart.Value.ToString("yyyy-MM-dd") : "")}_{(req.UnWindDateEnd != null ? req.UnWindDateEnd.Value.ToString("yyyy-MM-dd") : "")}.xlsx";
|
||
}
|
||
}
|
||
return File(bytes, xlsxMimeType, fileName);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 日终持仓风险导出
|
||
/// </summary>
|
||
public ActionResult DownloadEodPositionRisks(EodPositionRisksReq req)
|
||
{
|
||
try
|
||
{
|
||
req.BookIds = AssetUnitModel.IntersectAssetUnits(req.AssetIdGroupList, req.BookIds).ToList();
|
||
req.UserAssets = CurUser.GetAssetUnitIds();
|
||
req.UserClients = CurUser.GetClientIdsByCurUser(CurUser.交易管理_查看所有交易);
|
||
if (CurUser.交易管理_查看所有交易) { req.UserClients.Clear(); }
|
||
|
||
var bytes = new EodPositionRisksQueryService(CurUser).ExportEodPositionRisksToExcel(req);
|
||
return File(bytes, xlsxMimeType, $"日终-{req.ValueDate:yyyy-MM-dd}.xlsx");
|
||
}
|
||
catch (Exception e)
|
||
{
|
||
return ShowError("导出失败" + e.Message);
|
||
}
|
||
}
|
||
|
||
public JsonResult BatchDownloadEodPositionRisks(EodPositionRisksReq req)
|
||
{
|
||
req.BookIds = AssetUnitModel.IntersectAssetUnits(req.AssetIdGroupList, req.BookIds).ToList();
|
||
req.UserAssets = CurUser.GetAssetUnitIds();
|
||
req.UserClients = CurUser.GetClientIdsByCurUser(CurUser.交易管理_查看所有交易);
|
||
if (CurUser.交易管理_查看所有交易) { req.UserClients.Clear(); }
|
||
if (!new EodPositionRisksQueryService(CurUser).BatchDownloadEodPositionRisks(req))
|
||
{
|
||
return JsonError("线程正在被占用");
|
||
}
|
||
return JsonSuccess("开始生成文件");
|
||
}
|
||
|
||
public ActionResult EodPositionRiskExport(EodPositionRisksReq req, string processName)
|
||
{
|
||
switch (processName)
|
||
{
|
||
case "ExportEodPositionRisks":
|
||
ViewBag.Title = "日终持仓风险";
|
||
ViewBag.Url = "/trade/BatchDownloadEodPositionRisks";
|
||
break;
|
||
case "ExportEodPositionRisksSwap":
|
||
ViewBag.Title = "日终持仓风险_互换";
|
||
ViewBag.Url = "/swaptrade/BatchDownloadEodPositionRisks";
|
||
break;
|
||
default:
|
||
return ShowError("未查找到需要的页面");
|
||
}
|
||
ViewBag.ProcessName = processName;
|
||
return View(req);
|
||
}
|
||
|
||
[MyAuthorize("结算管理-交易明细")]
|
||
public JsonResult ExportTradeDetails(TradeDetailsReq req, string template = "默认")
|
||
{
|
||
var biaoTou = DBCacheManager.Single.GetStr(CacheTable.TradeDetailsBiaoTou, template);
|
||
var biaoWei = DBCacheManager.Single.GetStr(CacheTable.TradeDetailsBiaoWei, template);
|
||
var reportFilePath = new TradeDetailsQueryService(CurUser).ExportReport(req, biaoTou, biaoWei);
|
||
|
||
var appDocsPath = OtcAppContext.AppDocsPath;
|
||
List<string> docUrl = new List<string>();
|
||
|
||
foreach (var item in reportFilePath)
|
||
{
|
||
docUrl.Add($"/App_Docs{item.Replace(appDocsPath, "").Replace(appDocsPath, "").Replace("\\", "/")}");
|
||
}
|
||
|
||
return JsonSuccess("导出交易明细成功", docUrl);
|
||
}
|
||
|
||
[MyAuthorize("结算管理-交易明细")]
|
||
public async Task<JsonResult> SendTradeDetailsReport(TradeDetailsReq req, string template = "默认", List<string> receiver = null, List<string> attachFiles = null, bool skip = false)
|
||
{
|
||
var client = DataCacheProvider.GetClientDataSource().GetData(req.ClientId != 0 ? req.ClientId : req.ClientIdsInt[0]);
|
||
if (client == null)
|
||
{
|
||
throw new ServiceException("系统中没有此客户,clientId:" + req.ClientId);
|
||
}
|
||
var path = Server.MapPath("~/Statics/views/TradeDetailsListMail.cshtml");
|
||
if (req.StartDate == null)
|
||
{
|
||
req.StartDate = DateTime.MinValue;
|
||
}
|
||
if (req.EndDate == null)
|
||
{
|
||
req.EndDate = DateTime.Now;
|
||
}
|
||
if (req.ClientIdsInt.Count > 1)
|
||
{
|
||
return JsonError("发送邮件不支持客户多选!");
|
||
}
|
||
else if (req.ClientIdsInt.Count == 1)
|
||
{
|
||
req.ClientId = req.ClientIdsInt.FirstOrDefault();
|
||
}
|
||
|
||
var UseSingerBook = (client.SupProtocolDate != null && client.SupProtocolDate <= req.StartDate);
|
||
|
||
if (UseSingerBook)
|
||
{
|
||
path = Server.MapPath("~/Statics/views/TradeDetailsListMailV2.cshtml");
|
||
}
|
||
return await SendReportMails(req, CurUser, template, path, receiver, attachFiles, skip);
|
||
}
|
||
|
||
[MyAuthorize("结算管理-互换明细")]
|
||
public JsonResult ExportTradeSwapDetails(TradeDetailsReq req, string template = "默认")
|
||
{
|
||
var biaoTou = DBCacheManager.Single.GetStr(CacheTable.TradeSwapDetailsBiaoTou, template);
|
||
var biaoWei = DBCacheManager.Single.GetStr(CacheTable.TradeSwapDetailsBiaoWei, template);
|
||
var reportFilePath = new TradeSwapDetailsQueryService(CurUser).ExportReport(req, biaoTou, biaoWei);
|
||
|
||
var appDocsPath = OtcAppContext.AppDocsPath;
|
||
var docUrl = $"/App_Docs{reportFilePath.Replace(appDocsPath, "").Replace(appDocsPath, "").Replace("\\", "/")}";
|
||
return JsonSuccess("导出交易明细成功", docUrl);
|
||
}
|
||
|
||
[MyAuthorize("结算管理-互换明细")]
|
||
public JsonResult SendTradeSwapDetailsReport(TradeDetailsReq req, string template = "默认", List<string> receiver = null, bool skip = false)
|
||
{
|
||
var client = DataCacheProvider.GetClientDataSource().GetData(req.ClientId != 0 ? req.ClientId : req.ClientIdsInt[0]);
|
||
if (client == null)
|
||
{
|
||
throw new ServiceException("系统中没有此客户,clientId:" + req.ClientId);
|
||
}
|
||
var path = Server.MapPath("~/Statics/views/TradeSwapDetailsListMail.cshtml");
|
||
if (req.StartDate == null)
|
||
{
|
||
req.StartDate = DateTime.MinValue;
|
||
}
|
||
if (req.EndDate == null)
|
||
{
|
||
req.EndDate = DateTime.Now;
|
||
}
|
||
if (req.ClientIdsInt.Count > 1)
|
||
{
|
||
return JsonError("发送邮件不支持客户多选!");
|
||
}
|
||
else if (req.ClientIdsInt.Count == 1)
|
||
{
|
||
req.ClientId = req.ClientIdsInt.FirstOrDefault();
|
||
}
|
||
return SendSwapReportMails(req, template, path, receiver, skip);
|
||
}
|
||
|
||
public async Task<JsonResult> SendReportMails(TradeDetailsReq req, OptUserInfo user, string mailTemplateName, string tradeListHtmlViewPath, List<string> receiver = null, List<string> attachFiles = null, bool skip = false)
|
||
{
|
||
var biaoTou = DBCacheManager.Single.GetStr(CacheTable.TradeDetailsBiaoTou, mailTemplateName);
|
||
var biaoWei = DBCacheManager.Single.GetStr(CacheTable.TradeDetailsBiaoWei, mailTemplateName);
|
||
var luoKuan = DBCacheManager.Single.GetStr(CacheTable.TradeDetailsLuoKuan, mailTemplateName);
|
||
|
||
var tradeDetailsService = new TradeDetailsQueryService(user);
|
||
var reportFilePath = tradeDetailsService.ExportReport(req, biaoTou, biaoWei);
|
||
var report = tradeDetailsService.TradeDetailsReport;
|
||
|
||
string html;
|
||
var cacheResult = Server.RazorEngine.Handler.Cache.RetrieveTemplate("交易明细");
|
||
if (cacheResult.Success)
|
||
{
|
||
var templatePage = cacheResult.Template.TemplatePageFactory();
|
||
html = await Server.RazorEngine.RenderTemplateAsync(templatePage, report);
|
||
}
|
||
else
|
||
{
|
||
using (var reader = new StreamReader(tradeListHtmlViewPath))
|
||
{
|
||
var templateContent = reader.ReadToEnd();
|
||
html = await Server.RazorEngine.CompileRenderStringAsync("交易明细", templateContent, report);
|
||
}
|
||
}
|
||
|
||
var clientName = $"{report.ClientName} :<br/><br/>";
|
||
//当是招证时,发送交易明细发送邮件时,正文添加“请确认”3字
|
||
if (PS.Config.Is招证)
|
||
{
|
||
clientName += "<p>请确认</p><br/><br/>";
|
||
}
|
||
luoKuan = clientName + biaoTou + html + biaoWei + luoKuan;
|
||
|
||
try
|
||
{
|
||
var result = tradeDetailsService.SendTradeDetailReport(req, report, luoKuan,
|
||
reportFilePath, mailTemplateName, receiver, attachFiles, skip);
|
||
switch (result.ResultType)
|
||
{
|
||
case EmailTradeConfirmResultType.Succeed:
|
||
return JsonSuccess("发送交易明细报告成功");
|
||
case EmailTradeConfirmResultType.NoEmailSetting:
|
||
return JsonError("未设置邮箱,无法发送");
|
||
case EmailTradeConfirmResultType.EmailSentFailed:
|
||
return JsonError("发送邮件失败:" + result.ErrorMsg);
|
||
case EmailTradeConfirmResultType.Other:
|
||
default: return JsonError("发送邮件未知错误");
|
||
}
|
||
}
|
||
catch (Exception e)
|
||
{
|
||
if (e.Message.Contains("确认书"))
|
||
{
|
||
return JsonSuccess(e.Message, true);
|
||
}
|
||
throw;
|
||
}
|
||
}
|
||
|
||
public JsonResult SendSwapReportMails(TradeDetailsReq req, string mailTemplateName, string tradeListHtmlViewPath, List<string> receiver = null, bool skip = false)
|
||
{
|
||
var biaoTou = DBCacheManager.Single.GetStr(CacheTable.TradeSwapDetailsBiaoTou, mailTemplateName);
|
||
var biaoWei = DBCacheManager.Single.GetStr(CacheTable.TradeSwapDetailsBiaoWei, mailTemplateName);
|
||
var luoKuan = DBCacheManager.Single.GetStr(CacheTable.TradeSwapDetailsLuoKuan, mailTemplateName);
|
||
|
||
var tradeDetailsService = new TradeSwapDetailsQueryService(CurUser);
|
||
var reportFilePath = tradeDetailsService.ExportReport(req, biaoTou, biaoWei);
|
||
|
||
var report = tradeDetailsService.TradeSwapDetailsReport;
|
||
|
||
|
||
using var reader = new StreamReader(tradeListHtmlViewPath);
|
||
var templateContent = reader.ReadToEnd();
|
||
|
||
IRazorEngine razorEngine = new RazorEngine();
|
||
IRazorEngineCompiledTemplate template = razorEngine.Compile(templateContent);
|
||
var html = template.Run(report);
|
||
|
||
//if (!Engine.Razor.IsTemplateCached("互换明细", typeof(TradeSwapDetailsReport)))
|
||
//{
|
||
// using (var reader = new StreamReader(tradeListHtmlViewPath))
|
||
// {
|
||
// var templateContent = reader.ReadToEnd();
|
||
// Engine.Razor.Compile(templateContent, "互换明细", typeof(TradeSwapDetailsReport));
|
||
// }
|
||
//}
|
||
//var html = Engine.Razor.Run("互换明细", typeof(TradeSwapDetailsReport), report);
|
||
|
||
var clientName = $"{report.ClientName} :<br/><br/>";
|
||
luoKuan = clientName + biaoTou + html + biaoWei + luoKuan;
|
||
try
|
||
{
|
||
var result = tradeDetailsService.SendTradeDetailReport(req, report, luoKuan,
|
||
reportFilePath, mailTemplateName, receiver, skip);
|
||
switch (result.ResultType)
|
||
{
|
||
case EmailTradeConfirmResultType.Succeed:
|
||
return JsonSuccess("发送交易明细报告成功");
|
||
case EmailTradeConfirmResultType.NoEmailSetting:
|
||
return JsonError("未设置邮箱,无法发送");
|
||
case EmailTradeConfirmResultType.EmailSentFailed:
|
||
return JsonError("发送邮件失败:" + result.ErrorMsg);
|
||
case EmailTradeConfirmResultType.Other:
|
||
default: return JsonError("发送邮件未知错误");
|
||
}
|
||
}
|
||
catch (Exception e)
|
||
{
|
||
if (e.Message.Contains("确认书"))
|
||
{
|
||
return JsonSuccess(e.Message, true);
|
||
}
|
||
throw;
|
||
}
|
||
}
|
||
|
||
[MyAuthorize("风险控制-自定义限额规则")]
|
||
public ActionResult tradeConfirmRuleList()
|
||
{
|
||
return View();
|
||
}
|
||
|
||
[MyAuthorize("风险控制-自定义限额规则")]
|
||
public ActionResult tradeConfirmRuleEdit(string enid)
|
||
{
|
||
if (string.IsNullOrEmpty(enid))
|
||
{
|
||
return View(new trade_confirm_rule());
|
||
}
|
||
var intid = DataProtectHelper.DecryptInt(enid);
|
||
var record = db.trade_confirm_rule.Find(intid);
|
||
return View(record);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 保存交易确认规则
|
||
/// </summary>
|
||
[HttpPost]
|
||
public JsonResult tradeConfirmRuleEditJson(trade_confirm_rule req)
|
||
{
|
||
var record = new TradeConfirmRuleService(CurUser).saveTradeConfirmRule(req, CurUser.UserId, CurUser.UserName);
|
||
if (record == null)
|
||
{
|
||
return JsonError("交易确认规则名称重复,保存失败");
|
||
}
|
||
return Json(record);
|
||
}
|
||
|
||
public JsonResult deleteTradeConfirmRule(string enid)
|
||
{
|
||
if (string.IsNullOrEmpty(enid))
|
||
{
|
||
return JsonError("请选择要删除的交易确认规则");
|
||
}
|
||
|
||
var intid = DataProtectHelper.DecryptInt(enid);
|
||
var record = db.trade_confirm_rule.Find(intid);
|
||
db.trade_confirm_rule.Remove(record);
|
||
db.SaveChanges();
|
||
|
||
return JsonSuccess("删除成功");
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取交易确认规则列表页
|
||
/// </summary>
|
||
[HttpPost]
|
||
public JsonResult tradeTradeConfirmRuleQuery(trade_confirm_ruleReq req)
|
||
{
|
||
var sList = new TradeConfirmRuleService(CurUser).SearchTradeConfirmRuleList(req);
|
||
return Json(sList);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 终止简讯生成
|
||
/// </summary>
|
||
public JsonResult TradeterminationAbstract(trade_cash tc, trade td, bool isUnwind)
|
||
{
|
||
if (td == null)
|
||
{
|
||
return JsonError("信息不存在, 无法生成交易摘要");
|
||
}
|
||
new TradeExtendService(CurUser).SetTradeExtend(new[] { td });
|
||
var list = TradeTerminationAbstractService.GetAbstractInfoText(tc, td, isUnwind);
|
||
return Json(list);
|
||
|
||
}
|
||
|
||
public JsonResult GetTradeOfDate(int TradeId, DateTime ValueDate)
|
||
{
|
||
var trade = new TradeDalService(CurUser).GetTradeOrEodTrade(new[] { TradeId }, ValueDate).FirstOrDefault();
|
||
if (trade.TradeOriginalAmount == null)
|
||
{
|
||
var um = underlying_managerBLL.GetByCode(trade.UnderlyingCode);
|
||
trade.TradeOriginalAmount = trade.OriginalNotional / um.CountRatio;
|
||
}
|
||
return JsonSuccess("", trade);
|
||
}
|
||
|
||
[MyAuthorize("交易管理-批量波动率导入")]
|
||
public ActionResult tradeVolUpload()
|
||
{
|
||
return View();
|
||
}
|
||
|
||
[MyAuthorize("交易管理-批量对冲波动率导入")]
|
||
public ActionResult tradeHedgeVolUpload()
|
||
{
|
||
return View();
|
||
}
|
||
|
||
|
||
[MyAuthorize("交易管理-批量波动率导入")]
|
||
public ActionResult UploadTradeVolExcel(IFormFile file)
|
||
{
|
||
try
|
||
{
|
||
using var stream = file.OpenReadStream();
|
||
var ds = Office.ExcelHelper.ReadExcelAsDataSet(stream, new[] { 0 }, 0);
|
||
if (ds.Tables.Count < 1 || ds.Tables[0].Rows.Count < 2)
|
||
{
|
||
throw new ServiceException("读取导入数据失败:数据为空") { Tag = "111" };
|
||
}
|
||
|
||
var table = ds.Tables[0];
|
||
var reader = new DataRowReader(table, 0);
|
||
var message = string.Empty;
|
||
foreach (var row in table.Rows.Cast<DataRow>().Skip(1))
|
||
{
|
||
if (row.ItemArray.All(n => string.IsNullOrWhiteSpace(n?.ToString())))
|
||
{
|
||
continue;
|
||
}
|
||
|
||
reader.SetDataRow(row);
|
||
|
||
var tradeNumber = reader.GetString("交易编号", true);
|
||
var trade = db.trade.FirstOrDefault(x => x.TradeNumber == tradeNumber);
|
||
if (trade == null)
|
||
{
|
||
return JsonError("交易编号" + tradeNumber + "不存在,导入失败");
|
||
}
|
||
|
||
var valueDate = reader.GetDate("持仓日期", true).Value;
|
||
var smoothingDays = reader.GetInt("平滑过渡天数", false) ?? 1;
|
||
var remianDays = QdpCalendarHelper.GetNonHolidayDaysBetween(valueDate, trade.ExerciseDate.Value) + 1;
|
||
if (smoothingDays > remianDays)
|
||
{
|
||
message += $"交易[{tradeNumber}]平滑过渡天数{smoothingDays}不能大于存续天数{remianDays}天;";
|
||
}
|
||
|
||
var model = new TradeVolatility
|
||
{
|
||
TradeId = trade.id,
|
||
ValueDate = valueDate,
|
||
TradePositionVolatility = reader.GetPercent("持仓波动率", true).Value,
|
||
TradeCloseVolatility = reader.GetPercent("目标波动率", false) ?? reader.GetPercent("持仓波动率", true).Value,
|
||
NumOfSmoothingDays = smoothingDays,
|
||
OptId = UserId,
|
||
OptDate = DateTime.Now,
|
||
OptName = UserName,
|
||
IsFromTradeAdd = false
|
||
};
|
||
|
||
var dbModel = db.TradeVolatility.FirstOrDefault(x => x.ValueDate == model.ValueDate && x.TradeId == model.TradeId);
|
||
|
||
if (dbModel == null)
|
||
{
|
||
db.TradeVolatility.Add(model);
|
||
}
|
||
else
|
||
{
|
||
dbModel.TradePositionVolatility = model.TradePositionVolatility;
|
||
dbModel.TradeCloseVolatility = model.TradeCloseVolatility;
|
||
dbModel.NumOfSmoothingDays = model.NumOfSmoothingDays;
|
||
dbModel.OptId = model.OptId;
|
||
dbModel.OptName = model.OptName;
|
||
dbModel.OptDate = model.OptDate;
|
||
dbModel.IsFromTradeAdd = model.IsFromTradeAdd;
|
||
}
|
||
}
|
||
|
||
if (!string.IsNullOrEmpty(message))
|
||
{
|
||
throw new ServiceException(message);
|
||
}
|
||
db.SaveChanges();
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
LogFactory.GetLogger<eod_trade_risk_manualController>().Error("UploadTradeVolExcel", ex);
|
||
return JsonError(ex.Message);
|
||
}
|
||
|
||
return JsonSuccess("导入波动率成功");
|
||
}
|
||
|
||
|
||
[MyAuthorize("交易管理-批量对冲波动率导入")]
|
||
public ActionResult UploadTradeHedgeVolExcel(IFormFile file)
|
||
{
|
||
try
|
||
{
|
||
using var stream = file.OpenReadStream();
|
||
var ds = Office.ExcelHelper.ReadExcelAsDataSet(stream, new[] { 0 }, 1);
|
||
if (ds.Tables.Count < 1)
|
||
{
|
||
throw new ServiceException("读取导入数据失败:数据为空") { Tag = "111" };
|
||
}
|
||
|
||
var table = ds.Tables[0];
|
||
var reader = new DataRowReader(table, 0);
|
||
var message = string.Empty;
|
||
|
||
table.DefaultView.Sort = "持仓日期 ASC";
|
||
table = table.DefaultView.ToTable();
|
||
|
||
foreach (DataRow row in table.Rows)
|
||
{
|
||
var tradeNumber = row["交易编号"]?.ToString()?.Trim();
|
||
if (string.IsNullOrEmpty(tradeNumber))
|
||
{
|
||
throw new ServiceException($"交易编号 必须填写");
|
||
}
|
||
|
||
var trade = db.trade.FirstOrDefault(x => x.TradeNumber == tradeNumber);
|
||
if (trade == null)
|
||
{
|
||
return JsonError("交易编号【" + tradeNumber + "】不存在,导入失败");
|
||
}
|
||
if (trade.TradeType == "远期")
|
||
{
|
||
return JsonError("交易【" + tradeNumber + "】是远期交易,无对冲波动率");
|
||
}
|
||
if (trade.TradeType == "收益互换")
|
||
{
|
||
return JsonError("交易【" + tradeNumber + "】是收益互换,无对冲波动率");
|
||
}
|
||
if (trade.IsGroup == 1)
|
||
{
|
||
//黑箱
|
||
return JsonError("交易【" + tradeNumber + "】是黑箱交易父交易编号,请填写相关子交易的交易编号导入对冲波动率");
|
||
}
|
||
|
||
var valueTime = row["持仓日期"]?.ToString()?.Trim();
|
||
if (string.IsNullOrEmpty(valueTime))
|
||
{
|
||
throw new ServiceException($"持仓日期 必须填写");
|
||
}
|
||
|
||
if (!DateTime.TryParse(valueTime, out var valueDate))
|
||
{
|
||
throw new ServiceException($"持仓日期 填写错误");
|
||
}
|
||
|
||
if (valueDate < trade.StartDate)
|
||
{
|
||
return JsonError($"交易【{tradeNumber}】,持仓日期:{valueDate.ToString("yyyy-MM-dd")}必须大于等于交易成交日期:{trade.StartDate?.ToString("yyyy-MM-dd")}");
|
||
}
|
||
|
||
if (valueDate > trade.ExerciseDate)
|
||
{
|
||
return JsonError($"交易【{tradeNumber}】,持仓日期:{valueDate.ToString("yyyy-MM-dd")}必须小于等于交易到期日期:{trade.ExerciseDate?.ToString("yyyy-MM-dd")}");
|
||
}
|
||
var tSavedVol = row["对冲波动率"]?.ToString()?.Trim();
|
||
if (!double.TryParse(tSavedVol, out var tSavedVolNum))
|
||
{
|
||
throw new ServiceException($"对冲波动率 填写错误");
|
||
}
|
||
|
||
var tradeHedgeVodList = db.trade_hedge_vol.Where(o => o.TradeId == trade.id).ToList();
|
||
|
||
var tradeHedgeVod = tradeHedgeVodList.FirstOrDefault(o => o.ValueDate == valueDate);
|
||
if (tradeHedgeVod != null)
|
||
{
|
||
if (tSavedVol != null)
|
||
{
|
||
tradeHedgeVod.TradeSavedVol = tSavedVolNum;
|
||
tradeHedgeVod.OptName = UserName;
|
||
tradeHedgeVod.OptId = UserId;
|
||
tradeHedgeVod.OptDate = DateTime.Now;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (tSavedVol != null)
|
||
{
|
||
tradeHedgeVod = new trade_hedge_vol
|
||
{
|
||
TradeId = trade.id,
|
||
ValueDate = valueDate,
|
||
TradeSavedVol = tSavedVolNum,
|
||
OptName = UserName,
|
||
OptId = UserId,
|
||
OptDate = DateTime.Now
|
||
};
|
||
db.trade_hedge_vol.Add(tradeHedgeVod);
|
||
}
|
||
}
|
||
|
||
if (tradeHedgeVodList.Count(n => n.ValueDate > valueDate) == 0)
|
||
{
|
||
trade.TradeSavedVol = tSavedVolNum;
|
||
}
|
||
}
|
||
if (!string.IsNullOrEmpty(message))
|
||
{
|
||
throw new ServiceException(message);
|
||
}
|
||
db.SaveChanges();
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
LogFactory.GetLogger<eod_trade_risk_manualController>().Error("UploadTradeHedgeVolExcel", ex);
|
||
return JsonError(ex.Message);
|
||
}
|
||
return JsonSuccess("导入对冲波动率成功");
|
||
}
|
||
|
||
|
||
public ActionResult tradeDividendRateAndNoRiskRate()
|
||
{
|
||
return View();
|
||
}
|
||
/// <summary>
|
||
/// 导入无风险利率和分红率
|
||
/// </summary>
|
||
/// <param name="file"></param>
|
||
/// <returns></returns>
|
||
public ActionResult UploadDividendRateAndNoRiskRateExcel(IFormFile file)
|
||
{
|
||
try
|
||
{
|
||
using var stream = file.OpenReadStream();
|
||
var ds = Office.ExcelHelper.ReadExcelAsDataSet(stream, new[] { 0 }, 0);
|
||
if (ds.Tables.Count < 1 || ds.Tables[0].Rows.Count < 2)
|
||
{
|
||
throw new ServiceException("读取导入数据失败:数据为空") { Tag = "111" };
|
||
}
|
||
|
||
var table = ds.Tables[0];
|
||
var reader = new DataRowReader(table, 0);
|
||
var message = string.Empty;
|
||
foreach (var row in table.Rows.Cast<DataRow>().Skip(1))
|
||
{
|
||
if (row.ItemArray.All(n => string.IsNullOrWhiteSpace(n?.ToString())))
|
||
{
|
||
continue;
|
||
}
|
||
reader.SetDataRow(row);
|
||
var tradeNumber = reader.GetString("交易编号", true);
|
||
var trade = db.trade.FirstOrDefault(x => x.TradeNumber == tradeNumber);
|
||
if (trade == null)
|
||
{
|
||
message += $"交易编号" + tradeNumber + "不存在,导入失败";
|
||
continue;
|
||
}
|
||
var valueDate = reader.GetDate("日期", true).Value;
|
||
var valueType = reader.GetString("类型", true);
|
||
|
||
var valueTypeStr = "";
|
||
var value = reader.GetPercent("值", true).Value;
|
||
switch (valueType)
|
||
{
|
||
case "无风险利率":
|
||
valueTypeStr = "NoRiskRate";
|
||
trade.NoRiskRate = value;
|
||
break;
|
||
case "分红率":
|
||
valueTypeStr = "DividendRate";
|
||
trade.DividendRate = value;
|
||
break;
|
||
default:
|
||
throw new ServiceException("不支持" + valueType + "类型");
|
||
}
|
||
var dbModel = db.TradeHisData.FirstOrDefault(v => v.TradeId == trade.id && v.ValueDate == valueDate && v.ValueType == valueTypeStr);
|
||
if (dbModel == null)
|
||
{
|
||
dbModel = new TradeHisData
|
||
{
|
||
TradeId = trade.id,
|
||
ValueDate = valueDate,
|
||
ValueType = valueTypeStr
|
||
};
|
||
db.TradeHisData.Add(dbModel);
|
||
}
|
||
dbModel.OptId = UserId;
|
||
dbModel.OptName = UserName;
|
||
dbModel.OptDate = DateTime.Now;
|
||
dbModel.Value = value;
|
||
}
|
||
if (!string.IsNullOrEmpty(message))
|
||
{
|
||
throw new ServiceException(message);
|
||
}
|
||
db.SaveChanges();
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
LogFactory.GetLogger<eod_trade_risk_manualController>().Error("UploadDividendRateAndNoRiskRateExcel", ex);
|
||
return JsonError(ex.Message);
|
||
}
|
||
|
||
return JsonSuccess("导入成功");
|
||
}
|
||
|
||
public ActionResult entryexitListV2(int tradeid, bool IsOnlyCloseButton = false)
|
||
{
|
||
var r = from c in yldb.ClientCashInCashOut.Where(c => c.TradeId == tradeid && c.ValidState != ConsGlobal.InValid)
|
||
join up in yldb.clientcashincashout_update.Where(x => x.State == "修改待确认" && x.ValidState != "InValid") on c.id equals up.ClientcashincashoutId into up
|
||
from u in up.DefaultIfEmpty()
|
||
select new { c, u };
|
||
var list = r.ToList();
|
||
foreach (var item in list)
|
||
{
|
||
if (item.u != null)
|
||
{
|
||
item.c.Money = item.u.NewMoney;
|
||
item.c.Direction = item.u.NewDirection;
|
||
item.c.HappenDate = item.u.NewHappenDate;
|
||
item.c.State = item.u.State;
|
||
}
|
||
}
|
||
var retlist = list.Select(x => x.c).ToList();
|
||
ViewBag.IsOnlyCloseButton = IsOnlyCloseButton;
|
||
return View(retlist);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 查看界面资金记录
|
||
/// </summary>
|
||
/// <param name="enid"></param>
|
||
/// <returns></returns>
|
||
public ActionResult entryexitEdit(int? enid, int tradeid)
|
||
{
|
||
var r = new ClientCashInCashOut();
|
||
var trade = yldb.trade.Find(tradeid);
|
||
var client = DataCacheProvider.GetClientDataSource().GetData(trade.ClientId);
|
||
r.TradeId = trade.id;
|
||
r.TradeNumber = trade.TradeNumber;
|
||
r.ClientId = trade.ClientId;
|
||
r.ClientNumber = client.Number;
|
||
var isAdd = enid == null || enid == 0;
|
||
if (isAdd)
|
||
{
|
||
return View(r);
|
||
}
|
||
r = yldb.ClientCashInCashOut.Find(enid);
|
||
var up = yldb.clientcashincashout_update.Where(x => x.State == "修改待确认" && x.ValidState != ConsGlobal.InValid && x.ClientcashincashoutId == enid);
|
||
if (up.Any())
|
||
{
|
||
r.Money = up.FirstOrDefault().NewMoney;
|
||
r.Direction = up.FirstOrDefault().NewDirection;
|
||
}
|
||
|
||
r.Direction = r.TradeDirectionType;
|
||
r.Money = Math.Abs(r.Money ?? 0);
|
||
|
||
return View(r);
|
||
}
|
||
|
||
public JsonResult entryexitEditJson(EntryExitReq req)
|
||
{
|
||
var id = 0;
|
||
if (!string.IsNullOrEmpty(req.EncryptId))
|
||
{
|
||
id = DataProtectHelper.DecryptInt(req.EncryptId);
|
||
}
|
||
req.Direction = req.Direction == null ? null : req.Direction == "其他收入" ? "其他支出" : "其他收入";
|
||
var r = new ClientCashInCashOutService(CurUser).SaveEntryexit(id, req);
|
||
|
||
return JsonSuccess("更新成功", r);
|
||
}
|
||
|
||
public JsonResult entryexitIsconfirm(IEnumerable<int> ids)
|
||
{
|
||
bool HappenDateGreaterThanNow = false;
|
||
bool IsDeleteContract = false;
|
||
|
||
var r = from c in yldb.ClientCashInCashOut.Where(c => ids.Contains(c.id))
|
||
join up in yldb.clientcashincashout_update.Where(x => x.State == "修改待确认" && x.ValidState != ConsGlobal.InValid) on c.id equals up.ClientcashincashoutId into up
|
||
from u in up.DefaultIfEmpty()
|
||
select new { c, u };
|
||
|
||
var list = r.ToList();
|
||
|
||
var tradeIds = r.Select(t => t.c.TradeId).Distinct().FirstOrDefault();
|
||
var trade = yldb.trade.Where(c => c.id == tradeIds).FirstOrDefault();
|
||
|
||
List<int> all_tradeids = new List<int>();
|
||
all_tradeids.Add(trade.id);
|
||
if (trade.IsGroup == 2)
|
||
{
|
||
all_tradeids.Add(trade.ParentTradeId);
|
||
}
|
||
if (r.Where(e => e.c.Action == ClientCashInCashOut.系统操作_期权费).Any())
|
||
{
|
||
var codeList = yldb.trade_contract_r.Where(O => all_tradeids.Contains(O.TradeId) && O.IsValid);
|
||
if (codeList.Any())
|
||
{
|
||
IsDeleteContract = true;
|
||
}
|
||
}
|
||
else if (r.Where(e => e.c.Action == ClientCashInCashOut.系统操作_平仓费 || e.c.Action == ClientCashInCashOut.系统操作_行权费).Any())
|
||
{
|
||
var mindate = r.Where(e => e.c.Action == ClientCashInCashOut.系统操作_平仓费 || e.c.Action == ClientCashInCashOut.系统操作_行权费).OrderBy(x => x.c.HappenDate ?? DateTime.MaxValue).FirstOrDefault().c.HappenDate.Value.AddDays(-1); ;
|
||
var trade_cashs = yldb.trade_cash.Where(x => all_tradeids.Contains(x.TradeId) && (x.Action == ClientCashInCashOut.系统操作_平仓费 || x.Action == ClientCashInCashOut.系统操作_行权费) && x.ValidState != ConsGlobal.InValid && !x.IsDeleted && (x.ValueDate > mindate && x.HappenedDate == null || x.HappenedDate > mindate));
|
||
var tradecashid = trade_cashs.Select(x => x.id).ToHashSet();
|
||
var codeList = yldb.trade_contract_r.Where(O => all_tradeids.Contains(O.TradeId) && tradecashid.Contains(O.TradeCashId ?? 0) && O.Type != ContractTypeEnum.Trade && O.IsValid);
|
||
if (codeList.Any())
|
||
{
|
||
IsDeleteContract = true;
|
||
}
|
||
}
|
||
foreach (var item in list)
|
||
{
|
||
if (item.c.HappenDate > DateTime.Now)
|
||
{
|
||
HappenDateGreaterThanNow = true;
|
||
}
|
||
if ((item.c.State == "已确认" || item.c.State == "拒绝" || item.c.State == "已结算") && item.u == null)
|
||
{
|
||
return JsonError("已确认、拒绝、已结算的记录不能再次确认!");
|
||
}
|
||
}
|
||
var showconfirm = "";
|
||
if (IsDeleteContract && HappenDateGreaterThanNow)
|
||
{
|
||
showconfirm = "1.检测到当前交易已经生成过确认书,如果修改交易资金将删除已生成的确认书,是否继续修改?\r\n2.出入金交易日期晚于当前时间,确定确认该记录?";
|
||
}
|
||
else if (IsDeleteContract)
|
||
{
|
||
showconfirm = "检测到当前交易已经生成过确认书,如果修改交易资金将删除已生成的确认书,是否继续修改?";
|
||
}
|
||
else if (HappenDateGreaterThanNow)
|
||
{
|
||
showconfirm = "出入金交易日期晚于当前时间,确定确认该记录?";
|
||
}
|
||
|
||
return JsonSuccess("", showconfirm);
|
||
}
|
||
|
||
public JsonResult entryexitsetReject(IEnumerable<int> ids)
|
||
{
|
||
var r = from c in yldb.ClientCashInCashOut.Where(c => ids.Contains(c.id))
|
||
join up in yldb.clientcashincashout_update.Where(x => x.State == "修改待确认" && x.ValidState != ConsGlobal.InValid) on c.id equals up.ClientcashincashoutId into up
|
||
from u in up.DefaultIfEmpty()
|
||
select new { c, u };
|
||
|
||
var list = r.ToList();
|
||
|
||
foreach (var item in list)
|
||
{
|
||
if ((item.c.State == "已确认" || item.c.State == "拒绝" || item.c.State == "已结算") && item.u == null)
|
||
{
|
||
return JsonError("已确认、拒绝、已结算的记录不能再次拒绝!");
|
||
}
|
||
}
|
||
|
||
return JsonSuccess("");
|
||
}
|
||
|
||
public JsonResult excute(IEnumerable<int> ids)
|
||
{
|
||
new ClientCashInCashOutService(CurUser).ExcuteEntryExit(ids);
|
||
return JsonSuccess("执行成功");
|
||
}
|
||
|
||
public JsonResult reject(IEnumerable<int> ids)
|
||
{
|
||
var sbmsg = new ClientCashInCashOutService(CurUser).ClientCashInCashOutReject(ids);
|
||
return JsonSuccess(sbmsg.ToString());
|
||
}
|
||
|
||
public JsonResult delete(int id)
|
||
{
|
||
new ClientCashInCashOutService(CurUser).ExcuteEntryDele(id);
|
||
return JsonSuccess("执行成功");
|
||
}
|
||
|
||
[MyAuthorize("基础参数管理-除权除息交易")]
|
||
public ActionResult DividendTradeList(string settleDate = null)
|
||
{
|
||
ViewBag.valueDate = valuedateBLL.ValueDate.ToString("yyyy-MM-dd");
|
||
if (settleDate != null)
|
||
{
|
||
ViewBag.valueDate = settleDate;
|
||
}
|
||
return View();
|
||
}
|
||
|
||
public JsonResult QueryDividendTradeList(DividendTradeReq req)
|
||
{
|
||
req.AssetUnitIds = AssetUnitModel.IntersectAssetUnits(req.GroupId, req.AssetUnitIds).ToList();
|
||
|
||
var list = new DividendService(CurUser).QueryDividendTrade(req);
|
||
var res = new SearchListResult<DividendTrade>
|
||
{
|
||
rows = list,
|
||
page = 1,
|
||
total = 1,
|
||
records = list.Count
|
||
};
|
||
return Json(res);
|
||
}
|
||
|
||
public object ExportDividendTradeList(DividendTradeReq req)
|
||
{
|
||
req.AssetUnitIds = AssetUnitModel.IntersectAssetUnits(req.GroupId, req.AssetUnitIds).ToList();
|
||
|
||
var bytes = new DividendService(CurUser).ExportDividendTrade(req);
|
||
return File(bytes, xlsxMimeType, $"除权除息交易信息-{DateTime.Now:yyyy-MM-dd}.xlsx");
|
||
}
|
||
|
||
public JsonResult DevidendRatio(int[] ids, DateTime optDate, double ratio)
|
||
{
|
||
try
|
||
{
|
||
var changeService = new DbRecordChangesService<TradeChanges>(CurUser);
|
||
if (ratio <= 0)
|
||
{
|
||
changeService.Delete(ConsInfoChangeType.UserChange, ids, nameof(trade.DividendRatio), optDate);
|
||
}
|
||
else
|
||
{
|
||
var list = new List<TradeChanges>();
|
||
var infos = changeService.GetValue(
|
||
ConsInfoChangeType.UserChange,
|
||
ids,
|
||
nameof(trade.DividendRatio),
|
||
DateTime.MinValue,
|
||
optDate).GroupBy(O => O.RecordId)
|
||
.ToDictionary(
|
||
K => K.Key,
|
||
V => V.ToDictionary(K1 => K1.OptDate, V1 => double.TryParse(V1.NewValue, out var temp) ? (double?)temp : null));
|
||
foreach (var id in ids)
|
||
{
|
||
var dateGroup = infos.ContainsKey(id) ? infos[id] : null;
|
||
var fieldValue = (dateGroup?.Where(O => O.Key < optDate).OrderBy(O => O.Key).FirstOrDefault().Value.ToString()) ?? "";
|
||
|
||
var tc = new TradeChanges()
|
||
{
|
||
ChangeType = ConsInfoChangeType.UserChange,
|
||
RecordId = id,
|
||
FieldName = nameof(trade.DividendRatio),
|
||
FieldValue = fieldValue,
|
||
NewValue = ratio.ToString(),
|
||
OptDate = optDate,
|
||
Update = DateTime.Now
|
||
};
|
||
list.Add(tc);
|
||
}
|
||
changeService.Save(list);
|
||
}
|
||
return Json(Return.Success());
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
LogFactory.GetLogger("DevidendRatio").Error(ex);
|
||
return Json(Return.Fail());
|
||
}
|
||
}
|
||
|
||
[MyAuthorize("交易管理-交易预付金配置")]
|
||
public ActionResult tradeMarginTemplateList()
|
||
{
|
||
return View();
|
||
}
|
||
|
||
[MyAuthorize("交易管理-交易预付金配置")]
|
||
public ActionResult tradeMarginTemplateEdit(int tradeId)
|
||
{
|
||
var trade = yldb.trade.Find(tradeId);
|
||
//R1 三层级(2026-08-24 配合修改):候选只列有效模板——已作废模板一旦绑定,
|
||
//解析一级"找到即停"会让该交易直接视为无预付金(仅留日志),必须从源头挡住
|
||
var marginTemplates = yldb.margin_template_v2.Where(x => x.IsValid && x.TradeTypes.Contains(trade.TradeType) && !x.IsDefault).ToList();
|
||
marginTemplates.ForEach(x => x.Details = yldb.margin_template_detail.Where(y => y.MarginTemplateId == x.id).ToList());
|
||
|
||
var latestTradeMarginTemplate = yldb.trade_margin_template.Where(x => x.TradeId == tradeId).OrderByDescending(x => x.ValueDate).FirstOrDefault();
|
||
ViewBag.LatestValueDate = latestTradeMarginTemplate == null ? DateTime.MinValue : latestTradeMarginTemplate.ValueDate;
|
||
ViewBag.TradeId = tradeId;
|
||
|
||
return View(marginTemplates);
|
||
}
|
||
|
||
|
||
/// <summary>
|
||
/// 获取交易预付金模板列表
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
public static List<SelectListItem> GetTradeMarginTemplateList()
|
||
{
|
||
using (var db = new YLContext())
|
||
{
|
||
var marginTemplates = db.margin_template_v2.ToList();
|
||
if (marginTemplates != null && marginTemplates.Any())
|
||
{
|
||
return marginTemplates.Select(p => new SelectListItem
|
||
{
|
||
Text = p.Name,
|
||
Value = p.id.ToString()
|
||
}).ToList();
|
||
}
|
||
}
|
||
return new List<SelectListItem>();
|
||
}
|
||
|
||
|
||
//BUG-05 修正:接口补权限注解(与同组 tradeMarginTemplateList/Edit 一致),任何登录用户不可直改交易模板绑定
|
||
[MyAuthorize("交易管理-交易预付金配置")]
|
||
[HttpPost]
|
||
public JsonResult saveTradeMarginTemplate(trade_margin_template tradeMarginTemplate)
|
||
{
|
||
try
|
||
{
|
||
if (tradeMarginTemplate.MarginTemplateId <= 0)
|
||
{
|
||
throw new Exception("请选择有效的预付金模板");
|
||
}
|
||
|
||
var deletedRecords = yldb.trade_margin_template.Where(x => x.TradeId == tradeMarginTemplate.TradeId && x.ValueDate >= tradeMarginTemplate.ValueDate).ToArray();
|
||
yldb.trade_margin_template.RemoveRange(deletedRecords);
|
||
var updatedRecords = yldb.trade_margin_template.Where(x => x.TradeId == tradeMarginTemplate.TradeId && x.ValueDate < tradeMarginTemplate.ValueDate).ToList();
|
||
updatedRecords.ForEach(x => x.IsLatest = false);
|
||
|
||
tradeMarginTemplate.OptDate = DateTime.Now;
|
||
tradeMarginTemplate.OptId = CurUser.UserId;
|
||
tradeMarginTemplate.OptName = CurUser.UserName;
|
||
tradeMarginTemplate.IsLatest = true;
|
||
yldb.trade_margin_template.Add(tradeMarginTemplate);
|
||
|
||
yldb.SaveChanges();
|
||
|
||
#region 重置初始预付金
|
||
|
||
var trade = yldb.trade.Find(tradeMarginTemplate.TradeId);
|
||
//R1 三层级(2026-08-24 配合修改):收益互换跳过系统重算——互换初始预付金为手工录入/预付金腿承载
|
||
//(方案B 引擎回落链消费 trade.InitialMargin),且试算链路(GetInitialMarginWithPreHandle 克隆 id=0)
|
||
//对互换取不到模板绑定恒得 0,无条件重置会把手工录入值清零;与 TradeSaveService 保存守卫语义对齐
|
||
if (trade.TradeType != "收益互换")
|
||
{
|
||
trade.InitialMargin = MarginDefault.GetInitialMarginWithPreHandle(trade);
|
||
yldb.SaveChanges();
|
||
|
||
if (trade.IsGroup == 2)
|
||
{
|
||
var parentTrade = yldb.trade.Find(trade.ParentTradeId);
|
||
parentTrade.InitialMargin = yldb.trade.Where(x => x.ValidState != "InValid" && x.ParentTradeId == trade.ParentTradeId).Sum(y => y.InitialMargin);
|
||
yldb.SaveChanges();
|
||
}
|
||
}
|
||
|
||
#endregion
|
||
|
||
return JsonSuccess("更新成功", trade.InitialMargin);
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
return JsonError(ex.Message);
|
||
}
|
||
}
|
||
//BUG-05 修正(同组接口一并收紧):批量重设初始预付金同样要求预付金配置权限
|
||
[MyAuthorize("交易管理-交易预付金配置")]
|
||
[HttpPost]
|
||
public JsonResult batchSetInitialMargin(TradeMarginTemplateReq req)
|
||
{
|
||
////更新子交易初始预付金
|
||
//var tradesWithOutGroup = yldb.trade.Where(x => x.ValidState != "InValid" && x.InitialMargin == null && x.ClientId > 0 && x.IsGroup != 1 && x.TradeType != "结构化交易").ToList();
|
||
//if (clientId > 0)
|
||
//{
|
||
// tradesWithOutGroup = tradesWithOutGroup.Where(x => x.ClientId == clientId).ToList();
|
||
//}
|
||
//tradesWithOutGroup.ForEach(x =>
|
||
//{
|
||
// x.InitialMargin = MarginDefault.GetInitialMarginWithPreHandle(x);
|
||
//});
|
||
//yldb.SaveChanges();
|
||
|
||
////更新组合交易主预付金初始预付金
|
||
//var tradesGroup = yldb.trade.Where(x => x.ValidState != "InValid" && x.IsGroup == 1 && x.ClientId > 0).ToList();
|
||
//if (clientId > 0)
|
||
//{
|
||
// tradesGroup = tradesGroup.Where(x => x.ClientId == clientId).ToList();
|
||
//}
|
||
//tradesGroup.ForEach(x =>
|
||
//{
|
||
// x.InitialMargin = yldb.trade.Where(y => y.ValidState != "InValid" && y.ParentTradeId == x.id).Sum(y => y.InitialMargin);
|
||
//});
|
||
//yldb.SaveChanges();
|
||
|
||
using (var service = new TradeQueryService(CurUser))
|
||
{
|
||
service.BatchSetInitialMargin(req);
|
||
}
|
||
|
||
return JsonSuccess("更新成功");
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取交易预付金规则列表
|
||
/// </summary>
|
||
//BUG-05 修正:接口补权限注解(与同组 tradeMarginTemplateList/Edit 一致)
|
||
[MyAuthorize("交易管理-交易预付金配置")]
|
||
[HttpPost]
|
||
public JsonResult tradeMarginTemplateQuery(TradeMarginTemplateReq req)
|
||
{
|
||
req.UserAssets = CurUser.GetAssetUnitIds();
|
||
req.UserClients = CurUser.GetClientIdsByCurUser(CurUser.交易管理_查看所有交易);
|
||
req.LoginUserId = CurUser.UserId;
|
||
req.CurUserTradeIds = CurUser.GetTradeIdsByCurUser();
|
||
var sList = new TradeQueryService(CurUser).SearchTradeMarginTemplateList(req);
|
||
return Json(sList);
|
||
}
|
||
|
||
public bool CheckSelectedTrades(CheckSelectedGroupTradesForActionReq req)
|
||
{
|
||
if (yldb.trade.Any(x => req.tradeIds.Contains(x.id) && (x.IsGroup > 0 || x.ParentTradeId > 0)))
|
||
{
|
||
throw new ServiceException("分组操作只能选择非组合交易,且非结构化交易");
|
||
}
|
||
|
||
if (yldb.trade.Where(x => req.tradeIds.Contains(x.id)).Select(x => x.ClientId).Distinct().Count() > 1)
|
||
{
|
||
throw new ServiceException("分组操作只能选择同一客户交易");
|
||
}
|
||
|
||
if (yldb.trade.Any(x => req.tradeIds.Contains(x.id) && (!ConsTrade.TradeStatusBeforConfirmedAndConfirmed.Contains(x.TradeStatus) || x.Notional != x.OriginalNotional)))
|
||
{
|
||
throw new ServiceException("分组操作只能选择不存在了结记录的交易");
|
||
}
|
||
|
||
var trades = yldb.trade.Where(x => req.tradeIds.Contains(x.id)).ToList();
|
||
var tradeCashFlowList = trades.Where(l => l.TradeType != "现金流交易");
|
||
|
||
if (tradeCashFlowList.Any() && tradeCashFlowList.GroupBy(l => l.UnderlyingCode).ToList().Count > 1)
|
||
{
|
||
throw new ServiceException("分组交易必须要保持相同的标的");
|
||
}
|
||
if (tradeCashFlowList.Any() && tradeCashFlowList.GroupBy(l => l.SpotPrice).ToList().Count > 1)
|
||
{
|
||
throw new ServiceException("分组交易必须要保持相同的期初价格");
|
||
}
|
||
if (tradeCashFlowList.Any() && tradeCashFlowList.GroupBy(l => l.TradeDate).ToList().Count > 1)
|
||
{
|
||
throw new ServiceException("分组交易必须要保持相同的交易日期");
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
public ActionResult CheckSelectedTradesForAddGroup(CheckSelectedGroupTradesForActionReq req)
|
||
{
|
||
var result = new CheckSelectedGroupTradesForActionResponse()
|
||
{
|
||
IsSuccess = true
|
||
};
|
||
|
||
var trades = yldb.trade.Where(x => req.tradeIds.Contains(x.id)).ToList();
|
||
|
||
var underlyingId = 0;
|
||
var underlyingCode = string.Empty;
|
||
double? spotPrice = 0;
|
||
DateTime? tradeDate = null;
|
||
DateTime? exerciseDate = null;
|
||
var buySell = string.Empty;
|
||
double? tradePrice = 0;
|
||
trades.ForEach(x =>
|
||
{
|
||
if (x.TradeType != "现金流交易")
|
||
{
|
||
underlyingId = x.UnderlyingId;
|
||
underlyingCode = x.UnderlyingCode;
|
||
spotPrice = x.SpotPrice;
|
||
buySell = x.BuySell;
|
||
}
|
||
|
||
tradePrice += x.TradePrice * (x.BuySell == "卖出" ? 1 : -1);
|
||
|
||
if (tradeDate == null || tradeDate > x.TradeDate)
|
||
{
|
||
tradeDate = x.TradeDate;
|
||
}
|
||
|
||
if (exerciseDate == null || exerciseDate < x.ExerciseDate)
|
||
{
|
||
exerciseDate = x.ExerciseDate;
|
||
}
|
||
});
|
||
|
||
result.trade = new trade();
|
||
|
||
var firstDefaultTrade = trades.FirstOrDefault();
|
||
result.trade.AssetId = firstDefaultTrade.AssetId;
|
||
result.trade.AssetBookName = firstDefaultTrade.AssetBookName;
|
||
result.trade.TraderId = firstDefaultTrade.TraderId;
|
||
result.trade.TraderName = firstDefaultTrade.TraderName;
|
||
result.trade.ClientId = firstDefaultTrade.ClientId;
|
||
result.trade.ClientName = firstDefaultTrade.ClientName;
|
||
|
||
result.trade.UnderlyingId = underlyingId;
|
||
result.trade.UnderlyingCode = underlyingCode;
|
||
result.trade.TradeDate = tradeDate;
|
||
result.trade.ExerciseDate = exerciseDate;
|
||
result.trade.BuySell = buySell;
|
||
result.trade.IsUsePremiumRate = true;
|
||
result.trade.IsMoneynessOption = "是";
|
||
result.trade.TradePrice = tradePrice * (buySell == "卖出" ? 1 : -1);
|
||
result.trade.SpotPrice = spotPrice;
|
||
result.trade.StockEqvNotional = trades.Max(a => a.StockEqvNotional);
|
||
result.trade.StockEqvNotionalMax = result.trade.StockEqvNotional;
|
||
|
||
var actionResult = tradeEditGroup(result.trade, req.tradeIds.ToArray());
|
||
|
||
return actionResult;
|
||
}
|
||
|
||
public JsonResult DismissSelectedGroupTrades(int[] tradeIds)
|
||
{
|
||
var groupTrades = db.trade.Where(x => tradeIds.Contains(x.id) && x.IsGroup == 1 && ConsTrade.TradeStatusBeforConfirmed.Contains(x.TradeStatus)).ToList();
|
||
if (groupTrades.Count() < tradeIds.Count())
|
||
{
|
||
return JsonError("该操作仅支持选择未确认的组合主交易");
|
||
}
|
||
|
||
groupTrades.ForEach(x =>
|
||
{
|
||
if (x.TradeNumber.StartsWith("CW"))
|
||
{
|
||
x.TradeNumber = x.TradeNumber.Replace("CW", "XX");
|
||
}
|
||
else
|
||
{
|
||
x.TradeNumber = x.TradeNumber.Insert(0, "XX");
|
||
}
|
||
x.ValidState = "InValid";
|
||
|
||
var subTrades = db.trade.Where(y => y.ParentTradeId == x.id).ToList();
|
||
subTrades.ForEach(y =>
|
||
{
|
||
y.ParentTradeId = 0;
|
||
y.IsGroup = 0;
|
||
y.StructureType = null;
|
||
});
|
||
|
||
var childTradeIds = subTrades.Select(y => y.id).ToArray();
|
||
var subCashs = db.ClientCashInCashOut.Where(y => y.TradeId != null && childTradeIds.Contains(y.TradeId.Value)).ToList();
|
||
subCashs.ForEach(y =>
|
||
{
|
||
y.IsGroup = 0;
|
||
y.ParentTradeNumber = x.TradeNumber;
|
||
});
|
||
});
|
||
db.SaveChanges();
|
||
return JsonSuccess("组合分解成功");
|
||
}
|
||
|
||
public JsonResult CheckSelectedGroupTradesForAction(CheckSelectedGroupTradesForActionReq req)
|
||
{
|
||
var result = new CheckSelectedGroupTradesForActionResponse()
|
||
{
|
||
IsSuccess = true,
|
||
GotoTradeGroupActionList = false
|
||
};
|
||
|
||
if (yldb.trade.Any(x => req.tradeIds.Contains(x.id) && x.IsGroup == 0))
|
||
{
|
||
result.IsSuccess = false;
|
||
result.ErrorMsg = "分组了结只能选择分组交易";
|
||
return Json(result);
|
||
}
|
||
|
||
var trades = yldb.trade.Where(x => req.tradeIds.Contains(x.id)).ToList();
|
||
var parentTradeIds = trades.Where(x => x.ParentTradeId > 0).Select(x => x.ParentTradeId).Distinct().Union(trades.Where(x => x.ParentTradeId == 0).Select(x => x.id).Distinct());
|
||
|
||
if (parentTradeIds.Count() > 1)
|
||
{
|
||
result.IsSuccess = false;
|
||
result.ErrorMsg = "分组了结只能选择同一组内交易";
|
||
return Json(result);
|
||
}
|
||
else if (parentTradeIds.Count() == 0)
|
||
{
|
||
result.IsSuccess = false;
|
||
result.ErrorMsg = "请选择有效的分组了结子交易";
|
||
return Json(result);
|
||
}
|
||
else
|
||
{
|
||
var parentTradeId = parentTradeIds.First();
|
||
var trade = yldb.trade.Find(parentTradeId);
|
||
if (!trades.Any(d => d.id == parentTradeId))
|
||
{
|
||
trades.Add(trade);
|
||
}
|
||
if (trades.Count > 1)
|
||
{
|
||
result.GotoTradeGroupActionList = true;
|
||
}
|
||
trade.OriginalNotional = Math.Abs(trade.OriginalNotional ?? 0);
|
||
trade.Notional = Math.Abs(trade.Notional);
|
||
trade.TradeAmount = Math.Abs(trade.TradeAmount);
|
||
var underlying = DataCacheProvider.GetUnderlyingDataSource().GetData(trade.UnderlyingCode);
|
||
trade.TradeOriginalAmount = trade.OriginalNotional / underlying.CountRatio;
|
||
trade.CountRatio = underlying.CountRatio;
|
||
var tc = new TradeCashService(CurUser).GetLastSettleInfo(trade.id);
|
||
if (tc != null)
|
||
{
|
||
trade.UnWindDate = tc.ValueDate;
|
||
}
|
||
result.trade = trade;
|
||
result.trade.UnderlyingPrice = underlying.Price;
|
||
var parentTrade = trades.Where(x => x.IsGroup == 1 && x.TradeStatus == ConsTrade.确认成交).Select(l => l);
|
||
if (!parentTrade.Any())
|
||
{
|
||
result.IsSuccess = false;
|
||
result.ErrorMsg = "该交易非确认成交状态,不能分组了结";
|
||
return Json(result);
|
||
}
|
||
//区分是否勾选 子交易 ,沟子交易 走旧界面逻辑 ,没勾子交易走新界面逻辑
|
||
if (req.tradeIds.Count == 1 && req.tradeIds.Contains(parentTradeId))
|
||
{
|
||
|
||
var childTrades = yldb.trade.Where(x => parentTradeId == x.ParentTradeId && x.TradeStatus == ConsTrade.确认成交).Select(l => l).ToList();
|
||
if (childTrades.Count <= 0)
|
||
{
|
||
result.IsSuccess = false;
|
||
result.ErrorMsg = "子交易非确认成交状态,不能分组了结";
|
||
return Json(result);
|
||
}
|
||
result.ChildTradeCashs = childTrades.Select(x => new trade_cash() { TradeId = x.id, TradeNumber = x.TradeNumber, TradeType = x.TradeType, TradeAmount = x.TradeAmount, TradeOriginalAmount = x.OriginalNotional / underlying.CountRatio, StockEqvNotional = x.StockEqvNotional, OriginalStockEqvNotional = x.OriginalStockEqvNotional ?? 0, UnwindTradeAmount = x.TradeAmount, UnwindStockEqvNotional = x.StockEqvNotional, id = x.id, BuySell = x.BuySell }).ToList();
|
||
}
|
||
else
|
||
{
|
||
result.ChildTradeCashs = null;
|
||
}
|
||
}
|
||
|
||
return Json(result);
|
||
}
|
||
/// <summary>
|
||
/// 获取分组了结信息
|
||
/// </summary>
|
||
/// <param name="tradeId"></param>
|
||
/// <returns></returns>
|
||
/// <exception cref="ServiceException"></exception>
|
||
public JsonResult GetGroupTradesForAction(int tradeId)
|
||
{
|
||
var result = new CheckSelectedGroupTradesForActionResponse()
|
||
{
|
||
IsSuccess = true
|
||
};
|
||
var trade = yldb.trade.Find(tradeId);
|
||
var childrenTrades = yldb.trade.Where(x => x.ParentTradeId == tradeId);
|
||
var tradeCashGroupActions = yldb.trade_cash_group_action.Where(x => x.ParentTradeId == tradeId && x.Status == "待完成");
|
||
if (!tradeCashGroupActions.Any())
|
||
{
|
||
throw new ServiceException("未查询到该主交易的分组了结信息");
|
||
}
|
||
var parentTradeCashId = tradeCashGroupActions.FirstOrDefault().ParentTradeCashId;
|
||
var parentTradeCash = yldb.trade_cash.Find(parentTradeCashId);
|
||
var childrenTradeIds = tradeCashGroupActions.Select(s => s.TradeId);
|
||
trade.trade_cash = parentTradeCash;
|
||
trade.OriginalNotional = Math.Abs(trade.OriginalNotional ?? 0);
|
||
trade.Notional = Math.Abs(trade.Notional);
|
||
trade.TradeAmount = Math.Abs(trade.TradeAmount);
|
||
var underlying = DataCacheProvider.GetUnderlyingDataSource().GetData(trade.UnderlyingCode);
|
||
trade.TradeOriginalAmount = trade.OriginalNotional / underlying.CountRatio;
|
||
trade.CountRatio = underlying.CountRatio;
|
||
if (parentTradeCash.UnwindMethod == 0)
|
||
{
|
||
trade.IsUsePremiumRate = true;
|
||
}
|
||
else
|
||
{
|
||
trade.IsUsePremiumRate = false;
|
||
}
|
||
result.trade = trade;
|
||
result.trade.UnderlyingPrice = underlying.Price;
|
||
result.ChildTradeCashs = yldb.trade_cash.Where(x => x.ParentTradeCashId == parentTradeCashId).ToList();
|
||
result.ChildTradeCashs.ForEach(x =>
|
||
{
|
||
var td = childrenTrades.FirstOrDefault(n => n.id == x.TradeId);
|
||
if (td != null)
|
||
{
|
||
x.TradeId = td.id;
|
||
x.id = td.id;
|
||
x.TradeNumber = td.TradeNumber;
|
||
x.TradeType = td.TradeType;
|
||
x.TradeOriginalAmount = td.OriginalNotional / underlying.CountRatio;
|
||
x.StockEqvNotional = td.StockEqvNotional;
|
||
x.OriginalStockEqvNotional = td.OriginalStockEqvNotional ?? 0;
|
||
x.BuySell = td.BuySell;
|
||
}
|
||
});
|
||
return Json(result);
|
||
}
|
||
//public JsonResult GetObserveTradeChildInfo(int tradeId)
|
||
//{
|
||
// var tradeChilds = yldb.trade.Where(x => x.ParentTradeId == tradeId && x.ValidState == "Valid" && (x.TradeType == "凤凰期权" || x.TradeType == "雪球期权" || x.TradeType == "障碍期权" || x.TradeType == "气囊结构" || x.TradeType == "双鲨期权" || x.TradeType == "二元期权" || x.TradeType == "区间累积期权" || x.TradeType == "累计期权") && !ConsTrade.TradeCompleteStatus.Contains(x.TradeStatus)).OrderByDescending(l => l.id).Select(x => x).ToList();
|
||
// if (tradeChilds == null || tradeChilds.Count == 0)
|
||
// {
|
||
// throw new ServiceException("没有对应的子交易!");
|
||
// }
|
||
// return Json(tradeChilds);
|
||
//}
|
||
|
||
[MyAuthorize("交易管理-分组设置")]
|
||
public ActionResult tradeGroupActionList(string tradeNumber = "")
|
||
{
|
||
ViewBag.TradeNumber = tradeNumber;
|
||
return View();
|
||
}
|
||
|
||
public JsonResult TradeGroupActionQuery(TradeReq req)
|
||
{
|
||
req.UserAssets = CurUser.GetAssetUnitIds();
|
||
req.UserClients = CurUser.GetClientIdsByCurUser(CurUser.交易管理_查看所有交易);
|
||
req.CurUserTradeIds = CurUser.GetTradeIdsByCurUser();
|
||
var sList = new TradeQueryService(CurUser).SearchGroupActionList(req);
|
||
return Json(sList);
|
||
}
|
||
|
||
[HttpPost]
|
||
public JsonResult SearchGroupActionChildrenList(SearchGroupActionChildrenListReq req)
|
||
{
|
||
var trades = new TradeQueryService(CurUser).SearchGroupActionChildrenList(req);
|
||
|
||
return Json(trades);
|
||
}
|
||
|
||
public JsonResult SaveKnockInOutStatus(trade_airbag trade_airbag)
|
||
{
|
||
var airbag = new TradeAirbagService(CurUser).SaveKnockInOutStatus(
|
||
tradeId: trade_airbag.TradeId, KnockInOutDate: trade_airbag.KnockInOutDate, KnockInOutStatus: trade_airbag.KnockInOutStatus);
|
||
|
||
return Json(airbag);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 交易试算历史
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
public ActionResult quotaTrialHistory(int tradeId)
|
||
{
|
||
if (tradeId == 0)
|
||
{
|
||
return ShowError("参数错误");
|
||
}
|
||
ViewBag.TradeId = tradeId;
|
||
return View();
|
||
}
|
||
|
||
public JsonResult QueryQuotaTrialHistory(QuotaTrialReq req)
|
||
{
|
||
if (string.IsNullOrWhiteSpace(req.sidx))
|
||
{
|
||
req.sidx = "OptDate";
|
||
req.sord = "desc";
|
||
}
|
||
var result = new QuotaMonitorService(CurUser).QueryQuotaTrial(req);
|
||
return Json(result);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 交易试算
|
||
/// </summary>
|
||
/// <param name="id">交易Id,结构化交易请传主交易Id</param>
|
||
/// <param name="trialSource">试算来源,0:手动点击试算按钮;1:确认成交时自动调用;</param>
|
||
/// <returns></returns>
|
||
public ActionResult quotaTrial(int id, int trialSource = 0)
|
||
{
|
||
var quotaTrial = new QuotaMonitorService(CurUser).RunQuotaTrial(id, trialSource);
|
||
return View(quotaTrial);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 交易试算
|
||
/// </summary>
|
||
/// <param name="id">交易Id,结构化交易请传主交易Id</param>
|
||
/// <param name="trialSource">试算来源,0:手动点击试算按钮;1:确认成交时自动调用;</param>
|
||
/// <returns></returns>
|
||
public ActionResult showQuotaTrial(int id)
|
||
{
|
||
var service = new QuotaMonitorService(CurUser);
|
||
var quotaTrial = new QuotaTrialEx(service.QueryQuotaTrial(id));
|
||
var lastQuotaTrial = service.QueryLastQuotaTrial(quotaTrial.TradeId, true);
|
||
if (lastQuotaTrial != null)
|
||
{
|
||
quotaTrial.LastTrialStatus = lastQuotaTrial.TrialStatus;
|
||
ViewBag.LastStatus = quotaTrial.LastTrialStatus;
|
||
ViewBag.LastStatusStr = EnumHelper.GetDescriptionByName(quotaTrial.LastTrialStatus);
|
||
}
|
||
return View("quotaTrial", quotaTrial);
|
||
}
|
||
|
||
public JsonResult SaveQuotaTrial(QuotaTrial obj)
|
||
{
|
||
try
|
||
{
|
||
new QuotaMonitorService(CurUser).SaveQuotaTrial(obj);
|
||
new TradeRiskCheckLogService(CurUser).AddLog(obj);
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
LogFactory.GetLogger("SaveQuotaTrial").Error(ex);
|
||
return JsonError("保存试算说明失败!");
|
||
}
|
||
return JsonSuccess();
|
||
}
|
||
|
||
public JsonResult SaveRiskWarningDecisionLog(int quotaTrialId, string decision)
|
||
{
|
||
try
|
||
{
|
||
new TradeRiskCheckLogService(CurUser).AddWarningDecisionLog(quotaTrialId, decision);
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
LogFactory.GetLogger("SaveRiskWarningDecisionLog").Error(ex);
|
||
return JsonError("保存风控预警处理结果失败!");
|
||
}
|
||
return JsonSuccess();
|
||
}
|
||
|
||
[MyAuthorize("风险控制-接口审批列表")]
|
||
public ActionResult InterfaceApproval()
|
||
{
|
||
return View();
|
||
}
|
||
|
||
public JsonResult QueryInterfaceApproval(ApprovalReq req)
|
||
{
|
||
if (string.IsNullOrWhiteSpace(req.sidx))
|
||
{
|
||
req.sidx = "OptDate";
|
||
req.sord = "desc";
|
||
}
|
||
var result = new ApprovalService(CurUser).QueryInterfaceApproval(req);
|
||
return Json(result);
|
||
}
|
||
|
||
public ActionResult InterfaceApprovalRecord(int type, string code)
|
||
{
|
||
ViewBag.code = code;
|
||
ViewBag.type = type;
|
||
return View();
|
||
}
|
||
|
||
public JsonResult LinkApprovalResult(int interfaceId, string code, string additionalProcessing = "")
|
||
{
|
||
var service = new ApprovalService(CurUser);
|
||
var result = service.ApprovalResult(interfaceId, code, additionalProcessing);
|
||
return Json(result);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 交易变更记录
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
[MyAuthorize("交易管理-变更记录")]
|
||
public ActionResult TradeChange()
|
||
{
|
||
return View();
|
||
}
|
||
/// <summary>
|
||
/// 自定义导出弹出页面
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
public ActionResult Customexport()
|
||
{
|
||
return View();
|
||
}
|
||
/// <summary>
|
||
/// 自定义导出弹出页面
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
public ActionResult ExportClientEodPosition()
|
||
{
|
||
return View();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 导出客户列表
|
||
/// </summary>
|
||
[ResponseCache(NoStore = true)]
|
||
public ActionResult CustomtradeExport(CustomtradeExportreq req)
|
||
{
|
||
var marketZipFile = new OtcTradeListExportService(CurUser).ExportCustomTradeToExcel(req.startDate,
|
||
req.endDate, req.tradeStatus, req.tradeTypes);
|
||
return JsonSuccess("下载成功", new
|
||
{
|
||
marketZipFile = marketZipFile
|
||
});
|
||
}
|
||
|
||
/// <summary>
|
||
/// 展期记录
|
||
/// </summary>
|
||
/// <param name="enid"></param>
|
||
/// <param name="tradeNumber"></param>
|
||
/// <returns></returns>
|
||
public ActionResult ExtensionTime(string enid, string tradeNumber)
|
||
{
|
||
ViewBag.TradeId = DataProtectHelper.DecryptInt(enid);
|
||
ViewBag.TradeNumber = tradeNumber;
|
||
return View();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 查询展期记录
|
||
/// </summary>
|
||
/// <param name="enid"></param>
|
||
/// <returns></returns>
|
||
public JsonResult QueryExtensionTimeList(int tradeId)
|
||
{
|
||
var exerciseDate = DbContextFactory.GetYLDbContext().trade.Where(O => O.id == tradeId).Select(O => O.ExerciseDate).FirstOrDefault();
|
||
var result = new SearchListResult<ExtensionTime>();
|
||
result.Sum = exerciseDate;
|
||
result.rows = new ExtensionTimeService(CurUser).QueryExtensionTimeList(tradeId);
|
||
result.page = 1;
|
||
result.records = result.rows.Count();
|
||
result.total = 1;
|
||
return Json(result);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 新增或修改展期信息
|
||
/// </summary>
|
||
/// <param name="info"></param>
|
||
/// <returns></returns>
|
||
[HttpPost]
|
||
public JsonResult SaveExtensionTime(ExtensionTime info)
|
||
{
|
||
new ExtensionTimeService(CurUser).SaveExtensionTime(info);
|
||
return JsonSuccess("操作成功");
|
||
}
|
||
|
||
/// <summary>
|
||
/// 删除展期记录
|
||
/// </summary>
|
||
/// <param name="tradeEnId"></param>
|
||
/// <param name="id"></param>
|
||
/// <returns></returns>
|
||
[HttpPost]
|
||
public JsonResult deleteExtensionTime(int tradeId, int id)
|
||
{
|
||
new ExtensionTimeService(CurUser).DelExtensionTime(tradeId, id);
|
||
return JsonSuccess("删除成功");
|
||
}
|
||
|
||
public JsonResult QueryExtensionTimeHistory(int tradeId)
|
||
{
|
||
var datas =
|
||
db.TradeAuditLog.Where(n => n.TradeId == tradeId && n.OptType.StartsWith("交易展期"))
|
||
.Select(n => new TradeAuditLogDto
|
||
{
|
||
id = n.id,
|
||
OptType = n.OptType,
|
||
Changes = n.Changes,
|
||
OptName = n.OptName,
|
||
OptDate = n.OptDate
|
||
}).ToList();
|
||
datas = datas.OrderByDescending(n => n.id).ToList();
|
||
if (datas.Any())
|
||
{
|
||
if (datas.FirstOrDefault().OptType.Contains("撤销"))
|
||
{
|
||
datas.Clear();
|
||
}
|
||
else
|
||
{
|
||
if (datas.FirstOrDefault().Changes.Contains("],"))
|
||
{
|
||
var arr = JsonHelper.Deserialize<List<string[]>>(datas.FirstOrDefault().Changes);
|
||
var tag = arr == null || arr[0].Length <= 5 ? "" : arr[0][5];
|
||
if (tag.Length > 0)
|
||
{
|
||
datas = datas.Where(O => O.Changes.Contains(tag)).ToList();
|
||
datas.ForEach(x =>
|
||
{
|
||
x.Changes = JsonHelper.Serialize(JsonHelper.Deserialize<List<string[]>>(x.Changes)[0]);
|
||
});
|
||
}
|
||
}
|
||
else
|
||
{
|
||
var arr = JsonHelper.Deserialize<string[]>(datas.FirstOrDefault().Changes);
|
||
var tag = arr == null || arr.Length <= 5 ? "" : arr[5];
|
||
if (tag.Length > 0)
|
||
{
|
||
datas = datas.Where(O => O.Changes.Contains(tag)).ToList();
|
||
}
|
||
}
|
||
}
|
||
}
|
||
var result = new SearchListResult<TradeAuditLogDto>();
|
||
result.rows = datas;
|
||
result.page = 1;
|
||
result.records = datas.Count();
|
||
result.total = 1;
|
||
return Json(result);
|
||
}
|
||
|
||
#region----多次了结----
|
||
|
||
public JsonResult AjaxGetMultiCloseList(TradeMultiCloseQueryModel queryModel)
|
||
{
|
||
//if (queryModel.PageSize == 0)
|
||
//{
|
||
// queryModel.PageIndex = 1;
|
||
// queryModel.PageSize = 10000;
|
||
//}
|
||
queryModel.PageIndex = queryModel.page;
|
||
queryModel.PageSize = queryModel.rows;
|
||
if (!string.IsNullOrEmpty(queryModel.sidx))
|
||
{
|
||
queryModel.SortExpression = queryModel.sidx + " " + (string.IsNullOrEmpty(queryModel.sord) ? "asc" : queryModel.sord);
|
||
}
|
||
queryModel.UserAssets = CurUser.GetAssetUnitIds();
|
||
queryModel.UserClients = CurUser.GetClientIdsByCurUser(CurUser.交易管理_查看所有交易);
|
||
queryModel.LoginUserId = CurUser.UserId;
|
||
queryModel.CurUserTradeIds = CurUser.GetTradeIdsByCurUser();
|
||
|
||
var datas = new OtcOptionMultiCloseService(CurUser).GetPagedDatas(queryModel);
|
||
return JsonForJqGrid(datas);
|
||
}
|
||
|
||
[HttpPost]
|
||
public JsonResult AjaxGetMultiCloseGroupChildren(int TcId)
|
||
{
|
||
var datas = new OtcOptionMultiCloseService(CurUser).GetGroupChildrenDatas(TcId);
|
||
return Json(datas);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 场外成交记录-导出奇异要素
|
||
/// </summary>
|
||
public ActionResult UnwindMultiFactorsExport(TradeMultiCloseQueryModel queryModel)
|
||
{
|
||
queryModel.UserAssets = CurUser.GetAssetUnitIds();
|
||
queryModel.UserClients = CurUser.GetClientIdsByCurUser(CurUser.交易管理_查看所有交易);
|
||
queryModel.LoginUserId = CurUser.UserId;
|
||
queryModel.CurUserTradeIds = CurUser.GetTradeIdsByCurUser();
|
||
var bytes = new OtcOptionMultiCloseService(CurUser).ExportAllFieldsToExcel(queryModel);
|
||
return File(bytes, xlsxMimeType, $"多次了结全部要素_{DateTime.Now:yyyyMMddHHmmssffff}.xlsx");
|
||
}
|
||
|
||
#endregion
|
||
|
||
#region----非Action方法----
|
||
|
||
public static List<SelectListItem> GetLimitTargetTypes()
|
||
{
|
||
var AllLimitTarget = new List<SelectListItem>(){
|
||
new SelectListItem()
|
||
{
|
||
Text = LimitTargetTypeEnum.Delta.ToString(),
|
||
Value = LimitTargetTypeEnum.Delta.ToString()
|
||
},
|
||
new SelectListItem()
|
||
{
|
||
Text = LimitTargetTypeEnum.DeltaCash.ToString(),
|
||
Value = LimitTargetTypeEnum.DeltaCash.ToString()
|
||
},
|
||
new SelectListItem()
|
||
{
|
||
Text = LimitTargetTypeEnum.Gamma.ToString(),
|
||
Value = LimitTargetTypeEnum.Gamma.ToString()
|
||
},
|
||
new SelectListItem()
|
||
{
|
||
Text = LimitTargetTypeEnum.名义本金.ToString(),
|
||
Value = LimitTargetTypeEnum.名义本金.ToString()
|
||
}
|
||
};
|
||
|
||
return AllLimitTarget;
|
||
}
|
||
|
||
public static List<SelectListItem> GetLimitScopeTypes()
|
||
{
|
||
var AllLimitScope = new List<SelectListItem>(){
|
||
new SelectListItem()
|
||
{
|
||
Text = LimitScopeTypeEnum.单笔交易.ToString(),
|
||
Value = LimitScopeTypeEnum.单笔交易.ToString()
|
||
},
|
||
//new SelectListItem()
|
||
//{
|
||
// Text = LimitScopeTypeEnum.标的资产.ToString(),
|
||
// Value = LimitScopeTypeEnum.标的资产.ToString()
|
||
//},
|
||
//new SelectListItem()
|
||
//{
|
||
// Text = LimitScopeTypeEnum.品种.ToString(),
|
||
// Value = LimitScopeTypeEnum.品种.ToString()
|
||
//},
|
||
new SelectListItem()
|
||
{
|
||
Text = LimitScopeTypeEnum.交易员.ToString(),
|
||
Value = LimitScopeTypeEnum.交易员.ToString()
|
||
},
|
||
new SelectListItem()
|
||
{
|
||
Text = LimitScopeTypeEnum.客户.ToString(),
|
||
Value = LimitScopeTypeEnum.客户.ToString()
|
||
}
|
||
};
|
||
|
||
return AllLimitScope;
|
||
}
|
||
|
||
public static List<SelectListItem> GetLimitTimeTypes()
|
||
{
|
||
var AllLimitTimeTypes = new List<SelectListItem>(){
|
||
new SelectListItem()
|
||
{
|
||
Text = LimitTimeTypeEnum.每交易日.ToString(),
|
||
Value = LimitTimeTypeEnum.每交易日.ToString()
|
||
},
|
||
new SelectListItem()
|
||
{
|
||
Text = LimitTimeTypeEnum.存续累积.ToString(),
|
||
Value = LimitTimeTypeEnum.存续累积.ToString()
|
||
}
|
||
};
|
||
|
||
return AllLimitTimeTypes;
|
||
}
|
||
|
||
public List<margin_template> GetMarginTemplates()
|
||
{
|
||
return db.margin_template.ToList();
|
||
}
|
||
public List<KeyValuePair<string, string>> GetForwardDateNameDic()
|
||
{
|
||
DictionarySerivice dictionarySerivice = new DictionarySerivice();
|
||
return dictionarySerivice.GetForwardDateNameDic().ToList();
|
||
}
|
||
|
||
public List<SelectListItem> GetMarginTemplateItems()
|
||
{
|
||
var marginTemplateItems = new List<SelectListItem>();
|
||
var marginTemplates = db.margin_template.ToList();
|
||
marginTemplateItems.Add(new SelectListItem()
|
||
{
|
||
Text = "系统默认",
|
||
Value = "系统默认"
|
||
});
|
||
marginTemplateItems.Add(new SelectListItem()
|
||
{
|
||
Text = "无预付金",
|
||
Value = "无预付金"
|
||
});
|
||
marginTemplates.ForEach(x =>
|
||
{
|
||
marginTemplateItems.Add(new SelectListItem()
|
||
{
|
||
Text = x.Name,
|
||
Value = x.Name
|
||
});
|
||
});
|
||
|
||
return marginTemplateItems;
|
||
}
|
||
|
||
#endregion
|
||
|
||
|
||
[MyAuthorize("结算管理-结算确认书")]
|
||
public ActionResult tradeExchangeBook()
|
||
{
|
||
ViewBag.ValueDate = valuedateBLL.ValueDate.ToString("yyyy-MM-dd");
|
||
return View();
|
||
}
|
||
|
||
|
||
#region 华安资本 信用风险表
|
||
|
||
[MyAuthorize("监管报告-华安信用风险表")]
|
||
public ViewResult TradeCreditRisk(TradeCreditRiskViewModel model)
|
||
{
|
||
var valueDate = BLL.Eod.EodOperationBase.GetLastSettlementDate(valuedateBLL.ValueDate);
|
||
|
||
if (model == null)
|
||
{
|
||
model = new TradeCreditRiskViewModel();
|
||
}
|
||
|
||
model.ValueDate = valueDate.ToString("yyyy-MM-dd");
|
||
|
||
if (string.IsNullOrWhiteSpace(model.EndDate))
|
||
{
|
||
model.EndDate = model.ValueDate;
|
||
}
|
||
|
||
if (string.IsNullOrWhiteSpace(model.CreditRiskType))
|
||
{
|
||
model.CreditRiskType = "期权";
|
||
}
|
||
return View(model);
|
||
}
|
||
|
||
[MyAuthorize("监管报告-华安信用风险表")]
|
||
public ActionResult QueryTradeCreditRisk(TradeCreditRiskReq req)
|
||
{
|
||
var resultList = new TradeCreditRiskQueryService(CurUser).SearchTradeCreditRisk(req);
|
||
return Json(resultList);
|
||
}
|
||
|
||
[MyAuthorize("监管报告-华安信用风险表")]
|
||
public JsonResult ExportTradeCreditRisk(TradeCreditRiskReq req)
|
||
{
|
||
req.page = 1;
|
||
req.rows = 100000;
|
||
|
||
var sList = new TradeCreditRiskQueryService(CurUser).SearchTradeCreditRisk(req);
|
||
|
||
var datas = sList.rows.ToList();
|
||
var sourcePath = Server.MapPath("~/App_Docs");
|
||
|
||
string sourcefilename = req.CreditRiskType == "期权" ? "华安资本信用风险场外期权.xlsx" : req.CreditRiskType == "远期" ? "华安资本信用风险远期.xlsx" : "华安资本信用风险场外互换.xlsx";
|
||
var sourceFileName = Path.Combine(sourcePath, "导出模板", sourcefilename);
|
||
var targetPath = Path.Combine(sourcePath, "Temp", DateTime.Now.ToString("yyyyMMdd"));
|
||
|
||
if (!Directory.Exists(targetPath))
|
||
{
|
||
Directory.CreateDirectory(targetPath);
|
||
}
|
||
string FileNamekey = req.CreditRiskType == "期权" ? "场外期权" : req.CreditRiskType == "远期" ? "远期" : "场外互换";
|
||
var targetFileName = Path.Combine(targetPath, $"{FileNamekey}{DateTime.Now.ToString("yyyyMMdd")}.xlsx");
|
||
|
||
var modelDict = new Dictionary<string, object>
|
||
{
|
||
{"场外期权(华安资本)", datas}
|
||
};
|
||
|
||
if (req.CreditRiskType == "远期")
|
||
{
|
||
modelDict = new Dictionary<string, object>
|
||
{
|
||
{"商品远期、商品现货、收益互换、场外期权(华安资本)", datas}
|
||
};
|
||
}
|
||
else if (req.CreditRiskType == "互换")
|
||
{
|
||
modelDict = new Dictionary<string, object>
|
||
{
|
||
{"场外互换(华安资本)", datas}
|
||
};
|
||
}
|
||
|
||
var path = ExcelTemplate.GeneratePDFFromExeclTemplate(sourcePath, sourceFileName, modelDict, targetPath, targetFileName, null, null, null, false, callback: (sheet) =>
|
||
{
|
||
if (!datas.Any())
|
||
{
|
||
sheet.First().InsertRow(2, 1, 1);//此模板无数据则插入空行,注意样式
|
||
}
|
||
});
|
||
//补丁,返回一个相对地址
|
||
var relativePath = path.Substring(path.IndexOf("App_Docs") - 1);
|
||
return JsonSuccess("生成成功", relativePath);
|
||
}
|
||
|
||
#endregion
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
/// <param name="ids"></param>
|
||
/// <param name="reCheck">0:保存,1:平仓复核,2:行权复核,3:审批</param>
|
||
/// <returns></returns>
|
||
public ActionResult tradeSettle(string ids, int reCheck = 0)
|
||
{
|
||
ViewBag.Ids = ids;
|
||
ViewBag.reCheck = reCheck;
|
||
return View();
|
||
}
|
||
|
||
#region 报送相关字段填写
|
||
|
||
public ActionResult tradeSubmissionFields(string enid)
|
||
{
|
||
var id = DataProtectHelper.DecryptInt(enid);
|
||
var trade = yldb.trade.Find(id);
|
||
trade.MetaDic = new TradeMetaService(CurUser).GetTradeMeta(trade.id);
|
||
|
||
var trade_Report = yldb.trade_Report.Where(x => x.TradeId == id).FirstOrDefault();
|
||
if (trade_Report == null)
|
||
{
|
||
var marinRate = YLErp.Modules.UnderlyingModule.UnderlyingHelper.GetApplicableMarginRate(trade.ClientId, trade.UnderlyingCode, trade.TradeDate.Value);
|
||
if (marinRate == null)
|
||
{
|
||
marinRate = new client_margin_detail()
|
||
{
|
||
init_rate = 1,
|
||
maintain_rate = 1
|
||
};
|
||
}
|
||
trade_Report = new trade_report();
|
||
trade_Report.TradeId = id;
|
||
#region 初始化默认值 TRS-ZS-142
|
||
trade_Report.PerformanceGuarantee = "部分担保";
|
||
trade_Report.IsUsePerformanceColl = "否";
|
||
trade_Report.PerformanceExplain = "详见交易确认书。";
|
||
trade_Report.IsPerformanceCollInterest = "否";
|
||
trade_Report.InitialPerformanceColl = (decimal)marinRate.init_rate * 100;
|
||
trade_Report.RecoveryPerformanceColl = (decimal)marinRate.maintain_rate * 100;
|
||
trade_Report.UnwindPerformanceColl = trade_Report.RecoveryPerformanceColl;
|
||
trade_Report.EodPerformanceColl = trade_Report.RecoveryPerformanceColl;
|
||
trade_Report.PerformanceCollType = "0";
|
||
trade_Report.PerformanceCollRange = "0";
|
||
trade_Report.PerformanceRemark = "详见交易确认书及定义性文件";
|
||
#endregion
|
||
}
|
||
if (trade.MetaDic.TryGetValue("主协议编号", out string value1))
|
||
{
|
||
trade_Report.MainProtocolCode = value1;
|
||
}
|
||
if (trade.MetaDic.TryGetValue("补充协议编号", out string value2))
|
||
{
|
||
trade_Report.SupProtocolCode = value2;
|
||
}
|
||
if (trade.MetaDic.TryGetValue("清算机构", out string value3))
|
||
{
|
||
trade_Report.ClearingAgency = value3;
|
||
}
|
||
if (trade.MetaDic.TryGetValue("交易场所", out string value4))
|
||
{
|
||
trade_Report.TradingPlace = value4;
|
||
}
|
||
if (trade.MetaDic.TryGetValue("其他交易场所", out string value5))
|
||
{
|
||
trade_Report.OtherTradingPlace = value5;
|
||
}
|
||
|
||
trade_Report.TradeType = trade.TradeType;
|
||
trade_Report.TradeStatus = trade.TradeStatus;
|
||
trade_Report.clientId = trade.ClientId;
|
||
trade_Report.FillingPartyRole = trade.OpponentRole == "乙方" ? "甲方" : "乙方";
|
||
|
||
bool isreport = false;
|
||
var contractCodeList = yldb.trade_contract_r.Where(O => O.TradeId == id && O.Type == "交易确认书").Select(O => O.ContractCode).ToList();
|
||
foreach (var code in contractCodeList)
|
||
{
|
||
//如果查不到,说明是新交易,不用修改报送状态;
|
||
if (string.IsNullOrWhiteSpace(code))
|
||
{ continue; }
|
||
var infoTag = $"_{code.Replace("_", "-")}_成交_";
|
||
isreport = yldb.sac_report_notes.Where(O => O.InfoTag.Contains(infoTag)).Any();
|
||
if (isreport == true) break;
|
||
}
|
||
|
||
ViewBag.isreport = isreport;
|
||
return View(trade_Report);
|
||
}
|
||
|
||
public JsonResult tradeSubmissionJson(trade_report req)
|
||
{
|
||
var ret = new TradeReportService(CurUser).SaveTradeReport(req);
|
||
return JsonSuccess("保存成功", ret);
|
||
}
|
||
|
||
public ActionResult submissionFieldsHistory(string encryptId)
|
||
{
|
||
var tradeId = DataProtectHelper.DecryptInt(encryptId);
|
||
var datas =
|
||
db.TradeAuditLog.Where(n => n.TradeId == tradeId && n.OptType == "修改报送相关字段")
|
||
.Select(n => new TradeAuditLogDto
|
||
{
|
||
id = n.id,
|
||
OptType = n.OptType,
|
||
Changes = n.Changes,
|
||
OptName = n.OptName,
|
||
OptDate = n.OptDate
|
||
}).ToArray();
|
||
datas = datas.GroupBy(O => new { O.OptDate, O.OptName, O.OptType }).Select(O => O.First()).OrderByDescending(n => n.id).ToArray();
|
||
foreach (var item in datas)
|
||
{
|
||
item.Changes = new DatatraceQueryService(CurUser).ReplaceDataChanges(new trade(), item.Changes);
|
||
}
|
||
if (datas.Count()>=1)
|
||
{
|
||
datas.Last().OptType = "新增报送相关字段";
|
||
}
|
||
return View(datas);
|
||
}
|
||
|
||
#endregion
|
||
}
|
||
}
|