152 lines
6.8 KiB
C#
152 lines
6.8 KiB
C#
using NPOI.SS.Formula.Functions;
|
|
using Org.BouncyCastle.Ocsp;
|
|
using System.Diagnostics;
|
|
using YLErp.DBModels.Consts;
|
|
using YLErp.Models;
|
|
using YLErp.Plugins.TradeDocGenerator.Abstracts;
|
|
|
|
namespace YLErp.Modules.TradeModule.DocGenerateModule
|
|
{
|
|
public class TransactionGenerateService : BatchSettlementBillGenerateService
|
|
{
|
|
public TransactionGenerateService(OptUserInfo userInfo) : base(userInfo)
|
|
{
|
|
|
|
}
|
|
|
|
/// <summary>
|
|
/// 生成确认书
|
|
/// </summary>
|
|
/// <param name="clientID">要生成确认书的客户Id</param>
|
|
/// <param name="docType">生成的确认书文件类型</param>
|
|
/// <param name="errors">错误信息</param>
|
|
/// <param name="files">生成的确认书文件路径</param>
|
|
/// <param name="startDate">持仓日期区间-开始日期</param>
|
|
/// <param name="endDate">持仓日期区间-结束日期</param>
|
|
/// <param name="TradeTypes">要包含的交易类型</param>
|
|
/// <returns></returns>
|
|
public IEnumerable<TradeDocGenerateResult> Generate(int[] clientIds, string docType, DateTime startDate, DateTime endDate, string[] TradeTypes, List<int> sealResults)
|
|
{
|
|
var idquery = from tc in DbContext.trade_cash
|
|
join t in DbContext.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 >= startDate
|
|
&& t.ValueDate <= endDate).Select(x => x.id).ToList();
|
|
|
|
var tid2 = DbContext.trade.Where(x => x.TradeType == "累计期权" && x.ValidState != ConsGlobal.InValid && x.TradeDate >= startDate && x.TradeDate <= endDate).Select(x => x.id).ToList();
|
|
var tcid2 = DbContext.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 DbContext.trade_cash
|
|
join t in DbContext.trade
|
|
on tc.TradeId equals t.id
|
|
where
|
|
TradeTypes.Contains(t.TradeType)
|
|
&& tcid.Contains(tc.id)
|
|
select new { t, tc });
|
|
|
|
var query2 = (from tc in DbContext.trade_cash
|
|
join t in DbContext.trade
|
|
on tc.TradeId equals t.id
|
|
where
|
|
t.ValidState != ConsGlobal.InValid
|
|
&& tc.ValidState != ConsGlobal.InValid
|
|
&& tc.IsDeleted != true
|
|
&& tc.ValueDate >= startDate
|
|
&& tc.ValueDate <= endDate
|
|
&& TradeTypes.Contains(t.TradeType)
|
|
&& t.TradeType != "累计期权"
|
|
select new { t, tc });
|
|
|
|
var dict = query1.Union(query2);
|
|
|
|
if (sealResults != null && sealResults.Count > 0)
|
|
{
|
|
var docQuery = from dic in dict
|
|
join tcr in (from aa in DbContext.trade_contract_r
|
|
where aa.Type == ContractTypeEnum.Clearing && aa.IsValid
|
|
select aa) on dic.t.id equals tcr.TradeId into tcr1
|
|
from tcr in tcr1.DefaultIfEmpty()
|
|
join doc in DbContext.trade_contract_document
|
|
on tcr.ContractCode equals doc.Code into tempDoc
|
|
from doc in tempDoc.DefaultIfEmpty()
|
|
select new
|
|
{
|
|
t = dic.t,
|
|
tc = dic.tc,
|
|
doc
|
|
};
|
|
|
|
|
|
|
|
if (sealResults.Contains(2))
|
|
{
|
|
docQuery = docQuery.Where(t => sealResults.Contains((int)t.doc.SealResult) || t.doc.SealResult == null);
|
|
}
|
|
else
|
|
{
|
|
docQuery = docQuery.Where(t => sealResults.Contains((int)t.doc.SealResult));
|
|
}
|
|
|
|
dict = docQuery.Select(d => new { d.t, d.tc });
|
|
|
|
}
|
|
|
|
|
|
if (clientIds != null && clientIds.Any())
|
|
{
|
|
dict = dict.Where(x => clientIds.Contains(x.t.ClientId));
|
|
}
|
|
|
|
var tradelist = dict.ToList();
|
|
|
|
foreach (var trade in tradelist)
|
|
{
|
|
if (trade.t != null && trade.tc != null && trade.t.TradeType == "累计期权" && trade.tc.Action != "系统操作-期权费")
|
|
{
|
|
trade.tc.UnwindNotional = trade.t.OriginalNotional;
|
|
var amount = DbContext.trade_cash.Where(x => x.Action != "系统操作-期权费" && x.ValidState != ConsGlobal.InValid
|
|
&& x.IsDeleted != true && trade.t.id == x.TradeId).Sum(x => x.Amount);
|
|
trade.tc.Amount = amount;
|
|
}
|
|
}
|
|
|
|
var list = tradelist.Select(O => { O.t.trade_cash = O.tc.Clone(); return O.t.Clone(); }).GroupBy(O => new { O.trade_cash.ValueDate, O.ClientId })
|
|
.ToDictionary(K => K.Key, V => V.ToList());
|
|
|
|
AppManager.TryResolve(out ITradeSettleBillGenerator generatorV2);
|
|
var resultList = new List<TradeDocGenerateResult>();
|
|
foreach (var item in list)
|
|
{
|
|
if (generatorV2 != null)
|
|
{
|
|
var tcIds = item.Value.Select(x => x.trade_cash.id).Distinct().ToList();
|
|
var results = base.GenerateSingleV2(generatorV2, item.Value.ToList(), tcIds, docType, startDate, endDate);
|
|
resultList.Add(results);
|
|
}
|
|
else
|
|
{
|
|
throw new ServiceException("确认书插件不存在");
|
|
}
|
|
}
|
|
|
|
return resultList;
|
|
}
|
|
}
|
|
}
|