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

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;
}
}
}