263 lines
12 KiB
C#
263 lines
12 KiB
C#
using BaseOUDAL;
|
|
using OfficeOpenXml;
|
|
using Org.BouncyCastle.Ocsp;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Linq.Dynamic.Core;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using YLErp.BLL;
|
|
using YLErp.DBModels;
|
|
using YLErp.Model;
|
|
using YLErp.Modules.DataCompare.Dto;
|
|
using YLErp.Modules.SwapModule;
|
|
using YLErp.Office;
|
|
|
|
namespace YLErp.Modules.DataCompare
|
|
{
|
|
/// <summary>
|
|
/// 数据比较服务
|
|
/// </summary>
|
|
public class DataCompareService: YLBaseService
|
|
{
|
|
public DataCompareService(OptUserInfo userInfo) : base(userInfo)
|
|
{
|
|
}
|
|
|
|
public SearchListResult<HengTaiCompareData> QueryNeedCompareData(QueryNeedCompareDataRequest req)
|
|
{
|
|
var predicate = PredicateBuilder.Create<trade>(x => true);
|
|
if (!string.IsNullOrEmpty(req.TradeNumber))
|
|
{
|
|
predicate = predicate.And(x => x.TradeNumber.Contains(req.TradeNumber));
|
|
}
|
|
if (req.AssetId!=null&&req.AssetId.Count>0)
|
|
{
|
|
predicate = predicate.And(p => req.AssetId.Contains(p.AssetId));
|
|
}
|
|
|
|
var predicateSwap = PredicateBuilder.Create<eod_swap>(d => d.ValueDate == req.ValueDate);
|
|
if (req.ShowException)
|
|
{
|
|
predicateSwap = predicateSwap.And(p => !p.IsSkipEod);
|
|
}
|
|
|
|
var query = from a in DbContext.trade.Where(predicate)
|
|
join b in DbContext.eod_swap.Where(predicateSwap) on a.id equals b.SwapTradeId
|
|
where a.TradeDate<=req.ValueDate || (a.TradeStatus==ConsTrade.已平仓&&a.UnWindDate<=req.ValueDate)
|
|
select new HengTaiCompareData
|
|
{
|
|
id=a.id,
|
|
ValueDate = req.ValueDate,
|
|
TradeNumber = a.TradeNumber,
|
|
AssetId = a.AssetId,
|
|
StartDate = a.StartDate,
|
|
TradeStatus =(b.ValueDate>=a.UnWindDate&& a.TradeStatus == ConsTrade.已平仓) ? ConsTrade.已平仓 : ConsTrade.确认成交,
|
|
TradeDate = a.TradeDate,
|
|
EndDate = a.ExerciseDate,
|
|
StructType = a.TradeType,
|
|
QuoteCurrency = a.QuoteCurrency,
|
|
ClientName = a.ClientName,
|
|
TraderName = a.TraderName,
|
|
SwapType = a.StructureType,
|
|
StockEqvNotional = b.NotionalValue,
|
|
StockEqvNotionalV2 = b.IsSkipEod ? b.NotionalValue : null,
|
|
Pv = b.IsSkipEod ? b.HTPostionValue : b.PostionValue,
|
|
PvV2 = b.IsSkipEod ? b.HTPostionValue : null,
|
|
AssetName = a.AssetBookName,
|
|
CheckResult = b.IsSkipEod,
|
|
VTradingFee=b.VTradingFee
|
|
};
|
|
|
|
if (string.IsNullOrEmpty(req.sidx))
|
|
{
|
|
req.sidx = "id";
|
|
req.sord = "desc";
|
|
}
|
|
return query.ToSearchList(req);
|
|
}
|
|
|
|
|
|
public DateTime GetLastCloseDate()
|
|
{
|
|
var model=DbContext.eodStatus.AsNoTracking().OrderByDescending(p => p.ValueDate).FirstOrDefault();
|
|
if (model != null)
|
|
{
|
|
return model.ValueDate;
|
|
}
|
|
return valuedateBLL.SystemDate.ValueDate;
|
|
}
|
|
|
|
|
|
|
|
public SearchListResult<OnlyHengTaiDataDto> QueryOnlyHengTaiData(QueryNeedCompareDataRequest req)
|
|
{
|
|
var predicate = PredicateBuilder.Create<reg_valuation_end_of_day>(x => x.NPV_DATE.Equals(req.ValueDate.ToString("yyyy-MM-dd")));
|
|
if (!string.IsNullOrEmpty(req.TradeNumber))
|
|
{
|
|
predicate = predicate.And(x => x.EXT_NO.Contains(req.TradeNumber));
|
|
}
|
|
var tradeNumberQuery = from a in DbContext.trade.AsNoTracking()
|
|
select a.TradeNumber;
|
|
predicate = predicate.And(p => !tradeNumberQuery.Contains(p.EXT_NO));
|
|
|
|
var query = from a in DbContext.reg_valuation_end_of_day.Where(predicate)
|
|
select new OnlyHengTaiDataDto
|
|
{
|
|
id=a.id,
|
|
ValueDate=req.ValueDate,
|
|
StockEqvNotionalV2=a.ORDCOUNT,
|
|
PvV2=a.NPV,
|
|
TradeNumber=a.EXT_NO,
|
|
EndDateStr=a.SETDATE_TERMINATE,
|
|
StartDateStr=a.START_DATE
|
|
};
|
|
|
|
if (string.IsNullOrEmpty(req.sidx))
|
|
{
|
|
req.sidx = "id";
|
|
req.sord = "desc";
|
|
}
|
|
return query.ToSearchList(req);
|
|
}
|
|
|
|
|
|
public byte[] ExprotExcel(QueryNeedCompareDataRequest req)
|
|
{
|
|
|
|
|
|
var predicate = PredicateBuilder.Create<trade>(x => true);
|
|
if (!string.IsNullOrEmpty(req.TradeNumber))
|
|
{
|
|
predicate = predicate.And(x => x.TradeNumber.Contains(req.TradeNumber));
|
|
}
|
|
if (req.AssetId != null && req.AssetId.Count > 0)
|
|
{
|
|
predicate = predicate.And(p => req.AssetId.Contains(p.AssetId));
|
|
}
|
|
|
|
var predicateSwap = PredicateBuilder.Create<eod_swap>(d => d.ValueDate == req.ValueDate);
|
|
if (req.ShowException)
|
|
{
|
|
predicateSwap = predicateSwap.And(p => !p.IsSkipEod);
|
|
}
|
|
|
|
List<HengTaiCompareData> dataList = (from a in DbContext.trade.Where(predicate)
|
|
join b in DbContext.eod_swap.Where(predicateSwap) on a.id equals b.SwapTradeId
|
|
select new HengTaiCompareData
|
|
{
|
|
id = a.id,
|
|
ValueDate = req.ValueDate,
|
|
TradeNumber = a.TradeNumber,
|
|
AssetId = a.AssetId,
|
|
StartDate = a.StartDate,
|
|
TradeStatus = a.TradeStatus,
|
|
TradeDate = a.TradeDate,
|
|
EndDate = a.ExerciseDate,
|
|
StructType = a.TradeType,
|
|
QuoteCurrency = a.QuoteCurrency,
|
|
ClientName = a.ClientName,
|
|
TraderName = a.TraderName,
|
|
SwapType = a.StructureType,
|
|
StockEqvNotional = b.NotionalValue,
|
|
StockEqvNotionalV2 = b.IsSkipEod ? b.NotionalValue : null,
|
|
Pv = b.IsSkipEod ? b.HTPostionValue : b.PostionValue,
|
|
PvV2 = b.IsSkipEod ? b.HTPostionValue : null,
|
|
VTradingFee=b.VTradingFee,
|
|
AssetName = a.AssetBookName,
|
|
CheckResult = b.IsSkipEod
|
|
}).OrderByDescending(p=>p.id).ToList();
|
|
|
|
var predicate2 = PredicateBuilder.Create<reg_valuation_end_of_day>(x => x.NPV_DATE.Equals(req.ValueDate.ToString("yyyy-MM-dd")));
|
|
if (!string.IsNullOrEmpty(req.TradeNumber))
|
|
{
|
|
predicate2 = predicate2.And(x => x.EXT_NO.Contains(req.TradeNumber));
|
|
}
|
|
var tradeNumberQuery = from a in DbContext.trade.AsNoTracking()
|
|
select a.TradeNumber;
|
|
predicate2 = predicate2.And(p => !tradeNumberQuery.Contains(p.EXT_NO));
|
|
|
|
var list2 = (from a in DbContext.reg_valuation_end_of_day.Where(predicate2)
|
|
select new OnlyHengTaiDataDto
|
|
{
|
|
id = a.id,
|
|
ValueDate = req.ValueDate,
|
|
StockEqvNotionalV2 = a.ORDCOUNT,
|
|
PvV2 = a.NPV,
|
|
TradeNumber = a.EXT_NO,
|
|
EndDateStr = a.SETDATE_TERMINATE,
|
|
StartDateStr = a.START_DATE
|
|
}).OrderByDescending(p => p.id).ToList();
|
|
|
|
|
|
var tplFilePath = OtcAppContext.MapPath("/App_Docs");
|
|
var sourceFileName = Path.Combine(tplFilePath, "导出模板", "与衡泰对账导出模板.xlsx");
|
|
var modelDict = new Dictionary<string, object>();
|
|
var model = new { list = dataList };
|
|
|
|
var modelDict2 = new Dictionary<string, object>();
|
|
var model2 = new { list = list2 };
|
|
|
|
modelDict.Add("本系统中的合约", model);
|
|
modelDict.Add("仅衡泰中有的合约", model2);
|
|
ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
|
|
return new ExcelTemplateGenerator().SetTemplateFile(sourceFileName).SetTemplateData(modelDict).Output();
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// 获取清算时间
|
|
/// </summary>
|
|
/// <param name="req"></param>
|
|
/// <returns></returns>
|
|
public LiquidationTimeDto GetLiquidationTime(QueryNeedCompareDataRequest req)
|
|
{
|
|
var res = new LiquidationTimeDto();
|
|
res.SystemLiquidationTime = "未清算";
|
|
res.HengTaiLiquidationTime = "未同步";
|
|
var model = DbContext.eodStatus.Where(p=>p.ValueDate==req.ValueDate).AsNoTracking().OrderByDescending(p => p.OptDate).FirstOrDefault();
|
|
if(model!=null&&model.OptDate!=null)
|
|
{
|
|
res.SystemLiquidationTime = model.OptDate.Value.ToString("yyyy-MM-dd HH:mm:ss");
|
|
}
|
|
var model2 = DbContext.reg_valuation_end_of_day.Where(p => p.NPV_DATE.Equals(req.ValueDate.ToString("yyyy-MM-dd"))).OrderByDescending(p => p.create_time).FirstOrDefault();
|
|
if (model2 != null)
|
|
{
|
|
res.HengTaiLiquidationTime = model2.create_time.ToString("yyyy-MM-dd HH:mm:ss");
|
|
}
|
|
return res;
|
|
}
|
|
/// <summary>
|
|
/// 校验日期区间是否有获取衡泰估值
|
|
/// </summary>
|
|
/// <param name="startDate"></param>
|
|
/// <param name="endDate"></param>
|
|
/// <exception cref="Exception"></exception>
|
|
public string CheckHTDataByDate(DateTime startDate,DateTime endDate)
|
|
{
|
|
|
|
var regList = DbContext.reg_valuation_end_of_day.FromSqlRaw($"select * from reg_valuation_end_of_day where NPV_DATE>='{startDate.ToString("yyyy-MM-dd")}' and NPV_DATE<='{endDate.ToString("yyyy-MM-dd")}'").ToList();
|
|
var allDays = (endDate - startDate).Days;
|
|
if (regList.Count==0)
|
|
{
|
|
return $"{startDate.ToString("yyyy-MM-dd")}未获取衡泰估值";
|
|
}
|
|
for (int i=0;i< allDays;i++)
|
|
{
|
|
var valueDate = valuedateBLL.GetNonHoliday(startDate.AddDays(i));
|
|
if (!regList.Any(x=>x.NPV_DATE.Equals(valueDate.ToString("yyyy-MM-dd"))))
|
|
{
|
|
return $"{valueDate.ToString("yyyy-MM-dd")}未获取衡泰估值";
|
|
}
|
|
}
|
|
return "";
|
|
}
|
|
public string GetHTLastDate()
|
|
{
|
|
var regValue= DbContext.reg_valuation_end_of_day.OrderByDescending(o=>o.NPV_DATE).FirstOrDefault();
|
|
return regValue == null ? "未获取衡泰估值" : regValue.NPV_DATE;
|
|
}
|
|
}
|
|
}
|