Files
zszq-trs/YLErpDAL/Modules/EodModule/EodSwapPositionMannualImportService.cs
T
2024-05-09 14:06:26 +08:00

287 lines
13 KiB
C#

using System.Data;
using YLErp.Commons;
namespace YLErp.Modules.EodModule
{
public class EodSwapPositionMannualImportService : YLBaseService
{
public EodSwapPositionMannualImportService(OptUserInfo userInfo) : base(userInfo)
{
}
/// <summary>
/// 导入交易
/// </summary>
/// <param name="streamIn"></param>
/// <param name="totalNum">当前文件中的目标期权总条数</param>
/// <param name="successNum">成功入库的数量</param>
public void ImportEodSwapPositionMannualFromExcel(Stream streamIn, DateTime valuedate, out int totalNum, out int successNum)
{
totalNum = 0;
successNum = 0;
var rowIndex = 1;
try
{
var ds = Office.ExcelHelper.ReadExcelAsDataSet(streamIn, new[] { 0 }, 1);
if (ds.Tables.Count < 1 || ds.Tables[0].Rows.Count < 1)
{
throw new ServiceException("读取导入数据失败:数据为空") { Tag = "111" };
}
var table = ds.Tables[0];
var reader = new DataRowReader(table);
totalNum = table.Rows.Count;
using (var trans = BeginTransaction())
{
List<eod_trade_position_swap_mannual> eod_Trade_Position_Swap_Mannuals = new List<eod_trade_position_swap_mannual>();
foreach (var row in table.Rows.Cast<DataRow>())
{
rowIndex++;
if (row.ItemArray.All(n => string.IsNullOrWhiteSpace(n?.ToString())))
{
totalNum--;
continue;
}
reader.SetDataRow(row);
//映射导入数据到交易对象
var tradeFlow = MapSwapTrade(reader, valuedate);
eod_Trade_Position_Swap_Mannuals.Add(tradeFlow);
successNum++;
}
var valuedates = eod_Trade_Position_Swap_Mannuals.Select(x => x.ValueDate).ToHashSet();
List<eod_trade_position_swap_mannual> remove = new List<eod_trade_position_swap_mannual>();
foreach (var date in valuedates)
{
if (DbContext.eod_trade_position_swap_mannual.Where(x => x.ValueDate == date).Any())
{
var clientNumbers = eod_Trade_Position_Swap_Mannuals.Where(x => x.ValueDate == date).Select(x => x.ClientNumber).ToHashSet();
foreach (var number in clientNumbers)
{
if (DbContext.eod_trade_position_swap_mannual.Where(x => x.ValueDate == date && x.ClientNumber == number).Any())
{
var underlys = eod_Trade_Position_Swap_Mannuals.Where(x => x.ValueDate == date && x.ClientNumber == number).Select(x => x.UnderlyingCode).ToHashSet();
var list = DbContext.eod_trade_position_swap_mannual.Where(x => x.ValueDate == date && x.ClientNumber == number && underlys.Contains(x.UnderlyingCode)).ToList();
remove.AddRange(list);
}
}
}
}
if (remove.Any())
{
DbContext.eod_trade_position_swap_mannual.RemoveRange(remove);
}
DbContext.eod_trade_position_swap_mannual.AddRange(eod_Trade_Position_Swap_Mannuals);
DbContext.SaveChanges();
trans.Commit();
}
}
catch (ServiceException se)
{
if (se.Tag != null)
{
throw;
}
throw new ServiceException($"第{rowIndex}行,{se.Message}");
}
catch (Exception ex)
{
LogFactory.GetLogger("导入互换交易").Error(ex);
throw new ServiceException($"第{rowIndex}行,发生错误:{ex.Message}", ex);
}
}
private eod_trade_position_swap_mannual MapSwapTrade(DataRowReader reader, DateTime valuedate)
{
var eod_Swap = new eod_trade_position_swap_mannual();
eod_Swap.ValueDate = reader.GetDate("估值日期", false) ?? valuedate;
eod_Swap.ClientNumber = reader.GetString("客户编号", false);
eod_Swap.ClientName = reader.GetString("客户名称", false);
eod_Swap.UnderlyingCode = reader.GetString("标的代码", false);
eod_Swap.UnderlyingName = reader.GetString("标的名称", false);
eod_Swap.Notional = reader.GetDouble("持仓数量", true) ?? 0;
eod_Swap.SpotPrice = reader.GetDouble("开仓均价", true) ?? 0;
eod_Swap.CurrentPrice = reader.GetDouble("标的现价", true) ?? 0;
eod_Swap.TotalFee = reader.GetDouble("交易总费用", true) ?? 0;
eod_Swap.AnnualFee = reader.GetDouble("固定收益", true) ?? 0;
eod_Swap.FloatingWinLoss = reader.GetDouble("浮动收益", true) ?? 0;
eod_Swap.Margin = reader.GetDouble("预付金占用", true) ?? 0;
eod_Swap.PositionPnl = reader.GetDouble("持仓盈亏", true) ?? 0;
eod_Swap.Strategy = reader.GetString("策略", false);
CheckAssignmentSwapTradeFlow(eod_Swap);
eod_Swap.OptId = UserId;
eod_Swap.OptName = UserName;
eod_Swap.OptDate = DateTime.Now;
return eod_Swap;
}
/// <summary>
/// 互换流水api导入
/// </summary>
/// <param name="reader"></param>
/// <returns></returns>
/// <exception cref="ServiceException"></exception>
public int EodTradeSwap(EodSwapTradeRequestDate data)
{
List<eod_trade_position_swap_mannual> add = new List<eod_trade_position_swap_mannual>();
List<eod_trade_position_swap_mannual> remove = new List<eod_trade_position_swap_mannual>();
using (var trans = BeginTransaction())
{
foreach (var model in data.models)
{
CheckNotNullSwapTradeFlow(model);
var eod_Swap = new eod_trade_position_swap_mannual();
eod_Swap.ValueDate = model.ValueDate ?? DateTime.Today; ;
eod_Swap.ClientNumber = model.ClientNumber;
eod_Swap.ClientName = model.ClientName;
eod_Swap.UnderlyingCode = model.UnderlyingCode;
eod_Swap.UnderlyingName = model.UnderlyingName;
eod_Swap.Notional = model.Notional ?? 0;
eod_Swap.SpotPrice = model.SpotPrice ?? 0;
eod_Swap.CurrentPrice = model.CurrentPrice ?? 0;
eod_Swap.TotalFee = model.TotalFee ?? 0;
eod_Swap.AnnualFee = model.AnnualFee ?? 0;
eod_Swap.FloatingWinLoss = model.FloatingWinLoss ?? 0;
eod_Swap.Margin = model.Margin ?? 0;
eod_Swap.PositionPnl = model.PositionPnl ?? 0;
eod_Swap.Strategy = model.Strategy;
CheckAssignmentSwapTradeFlow(eod_Swap);
eod_Swap.OptId = UserId;
eod_Swap.OptName = UserName;
eod_Swap.OptDate = DateTime.Now;
if (DbContext.eod_trade_position_swap_mannual.Where(x => x.ValueDate == eod_Swap.ValueDate && x.ClientNumber == eod_Swap.ClientNumber && x.UnderlyingCode == eod_Swap.UnderlyingCode).Any())
{
var list = DbContext.eod_trade_position_swap_mannual.Where(x => x.ValueDate == eod_Swap.ValueDate && x.ClientNumber == eod_Swap.ClientNumber && x.UnderlyingCode == eod_Swap.UnderlyingCode);
remove.AddRange(list);
}
add.Add(eod_Swap);
}
DbContext.eod_trade_position_swap_mannual.RemoveRange(remove);
DbContext.eod_trade_position_swap_mannual.AddRange(add);
DbContext.SaveChanges();
trans.Commit();
}
return add.Count;
}
private void CheckNotNullSwapTradeFlow(EodSwapTradeRequestModel model)
{
if (!model.ValueDate.HasValue)
{
throw new ServiceException($"估值日期 不能为空");
}
if (!model.SpotPrice.HasValue)
{
throw new ServiceException($"开仓均价 不能为空");
}
if (!model.CurrentPrice.HasValue)
{
throw new ServiceException($"标的现价 不能为空");
}
if (!model.TotalFee.HasValue)
{
throw new ServiceException($"交易总费用 不能为空");
}
if (!model.AnnualFee.HasValue)
{
throw new ServiceException($"固定收益 不能为空");
}
if (!model.FloatingWinLoss.HasValue)
{
throw new ServiceException($"浮动收益 不能为空");
}
if (!model.Margin.HasValue)
{
throw new ServiceException($"预付金占用 不能为空");
}
if (!model.PositionPnl.HasValue)
{
throw new ServiceException($"持仓盈亏 不能为空");
}
if (model.Strategy != "套利" && model.Strategy != "非套利")
{
throw new ServiceException($"策略 只能填充【套利】和【非套利】");
}
}
private void CheckAssignmentSwapTradeFlow(eod_trade_position_swap_mannual model)
{
string clientNumber = model.ClientNumber;
string clientName = model.ClientName;
if (!string.IsNullOrWhiteSpace(clientNumber))
{
var client = DataCacheProvider.GetClientDataSource().AsQueryable().FirstOrDefault(n => clientNumber.Equals(n.Number, StringComparison.OrdinalIgnoreCase));
if (client == null)
{
throw new ServiceException($"该客户编号[{clientNumber}]在系统中不存在");
}
model.ClientNumber = client.Number;
model.ClientId = client.id;
}
else if (!string.IsNullOrWhiteSpace(clientName))
{
var client = DataCacheProvider.GetClientDataSource().AsQueryable().FirstOrDefault(n => clientName.Equals(n.Name, StringComparison.OrdinalIgnoreCase));
if (client == null)
{
throw new ServiceException($"该客户名称[{clientName}]在系统中不存在");
}
model.ClientNumber = client.Number;
model.ClientId = client.id;
}
else
{
throw new ServiceException($"客户编号和客户名称不能同时为空");
}
string underlyingCode = model.UnderlyingCode;
string underlyingName = model.UnderlyingName;
if (!string.IsNullOrWhiteSpace(underlyingCode))
{
var underlying = DataCacheProvider.GetUnderlyingDataSource().GetData(underlyingCode);
if (underlying == null)
{
throw new ServiceException($"该标的代码[{underlyingCode}]在系统中不存在");
}
model.UnderlyingCode = underlying.UnderlyingCode;
}
else if (!string.IsNullOrWhiteSpace(underlyingName))
{
var underlying = DataCacheProvider.GetUnderlyingDataSource().AsQueryable().FirstOrDefault(n => underlyingName.Equals(n.UnderlyingName, StringComparison.OrdinalIgnoreCase));
if (underlying == null)
{
throw new ServiceException($"该标的名称[{underlyingName}]在系统中不存在");
}
model.UnderlyingCode = underlying.UnderlyingCode;
}
else
{
throw new ServiceException($"标的代码和标的名称不能同时为空");
}
if (model.Notional == 0)
{
throw new ServiceException($"持仓数量不能为0");
}
if (model.Strategy != "套利" && model.Strategy != "非套利")
{
throw new ServiceException($"策略 只能填充【套利】和【非套利】");
}
}
}
}