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

8949 lines
445 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using iTextSharp.text;
using iTextSharp.text.pdf;
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(string contractCode)
{
var uploadFileModel = Request.Form.Files.Count > 0 ? Request.Form.Files[0].ToUploadFileModel() : null;
var (flag, msg, optDate, stampPath) = new ConfirmationGenerateService(CurUser).UploadContractFileNew(contractCode, uploadFileModel);
if (flag)
{
return JsonSuccess(msg);
}
return JsonError(msg);
}
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.GroupBy(O => new { O.OptDate, O.OptName, O.OptType }).Select(O => O.First()).OrderByDescending(n => n.id).ToArray();
foreach (var item in datas)
{
if (IsExchange)
{
item.Changes = item.OptType == "批量调整-标的交易" ? new DatatraceQueryService(CurUser).ReplaceDataChanges(new trade(), item.Changes) : "";
}
else
{
item.Changes = item.OptType == "修改交易" ? 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("交易撤销成功");
}
public JsonResult tradeConfirm(string tradeids, string additionalProcessing, 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 ignoreMoneyCheck = tradeidArr.Count() == 1 && additionalProcessing == tradeBLL.LackOfMoney;
var isSkipApproval = false;
if (CurUser.交易管理_特批批量确认 && isSkipCheck)
{
ignoreMoneyCheck = true;
isSkipApproval = true;
}
var result = new TradeConfirmService(CurUser).tradeConfirm(tradeidArr, ignoreMoneyCheck, isSkipApproval);
//如果客户缺少资金而操作者有交易特批权限
if (!ignoreMoneyCheck && result.LackOfMoney)
{
return JsonSuccessData(new { proccessType = "AdditionalProcessing", type = PS.Config.ErpElement.Company == Configuration.CompanyEnum.天风 || config.SpecialOperateForTrade == 1 ? tradeBLL.LackOfMoney : "", TrialDataId = result.TrialDataId, message = result.errorMsg, typecode = result.type });
}
//生成交易确认书
if (PS.Config.IsAutoGenerateContracts && result.confirmedTradeIds?.Count > 0)
{
new TradeContractGenerateService(CurUser).GenerateContractsAsync(result.confirmedTradeIds, "确认书");
}
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 (result.changeConfirmPaths?.Count > 0)
{
return JsonSuccess("操作完成", new { generateChangeSuccess = true, url = result.changeConfirmPaths });
}
return JsonSuccess("操作完成");
}
}
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 ?? ""}&nbsp;&nbsp;&nbsp;&nbsp;{trade.ClientName}&nbsp;&nbsp;&nbsp;&nbsp;{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));
}
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("请选择文档类型!");
}
if (req.TradeDateStart == null) { req.TradeDateStart = DateTime.MinValue; }
if (req.TradeDateEnd == null) { req.TradeDateEnd = DateTime.MaxValue; }
var db_trade_contract_r = yldb.trade_contract_r.AsQueryable();
var query = from doc in yldb.trade_contract_document
join r in db_trade_contract_r
on doc.Code equals r.ContractCode
where doc.Type == ContractTypeEnum.Trade && doc.ValueDate >= req.TradeDateStart && doc.ValueDate <= req.TradeDateEnd && r.IsValid
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 (type == "PDF" && 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 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)
{
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);
var marginTemplates = yldb.margin_template_v2.Where(x => 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>();
}
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);
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);
}
}
[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>
[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).QuotaCheck(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();
}
[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
}
}