308 lines
11 KiB
C#
308 lines
11 KiB
C#
using System.Text;
|
|
using YLErp.DBModels.Consts;
|
|
using YLErp.Helpers;
|
|
using YLErp.Office;
|
|
|
|
namespace YLErp.Modules.ApiModule.ExportModule
|
|
{
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
public class OtcTradeContractDocExportService : YLBaseService
|
|
{
|
|
public OtcTradeContractDocExportService(OptUserInfo userInfo) : base(userInfo)
|
|
{
|
|
|
|
}
|
|
|
|
/// <summary>
|
|
/// 生成开仓确认书批量导出文件
|
|
/// </summary>
|
|
public byte[] GetZipFileOfOpenDocs(OtcTradeContractOpenDocExportRequest req, out TradeContractDocFileExportInfo[] exportInfos)
|
|
{
|
|
if (req is null)
|
|
{
|
|
throw new ArgumentNullException(nameof(req));
|
|
}
|
|
|
|
int[] clientIds = null;
|
|
|
|
if (req.ClientNumbers != null && req.ClientNumbers.Any())
|
|
{
|
|
clientIds = DataCacheProvider.GetClientDataSource().AsQueryable()
|
|
.Where(n => req.ClientNumbers.Contains(n.Number))
|
|
.Select(n => n.id).ToArray();
|
|
}
|
|
|
|
var tdPredicate = PredicateBuilder.Create<trade>(td => td.ValidState != ConsGlobal.InValid && td.TradeDate >= req.OpenDateRangeStart
|
|
&& ("结构化交易" != td.TradeType || td.IsGroup == 1) && td.IsGroup != 2);
|
|
|
|
if (req.TradeNumbers != null && req.TradeNumbers.Any())
|
|
{
|
|
tdPredicate = tdPredicate.And(td => req.TradeNumbers.Contains(td.TradeNumber));
|
|
}
|
|
|
|
if (req.TradeStatus != null && req.TradeStatus.Any())
|
|
{
|
|
tdPredicate = tdPredicate.And(td => req.TradeStatus.Contains(td.TradeStatus));
|
|
}
|
|
|
|
if (clientIds != null)
|
|
{
|
|
tdPredicate = tdPredicate.And(td => clientIds.Contains(td.ClientId));
|
|
}
|
|
|
|
if (req.OpenDateRangeEnd.HasValue)
|
|
{
|
|
tdPredicate = tdPredicate.And(td => td.TradeDate <= req.OpenDateRangeEnd.Value);
|
|
}
|
|
|
|
var rPredicate = PredicateBuilder.Create<trade_contract_r>(r => r.IsValid && (r.Type == ContractTypeEnum.Trade || r.Type == ContractTypeEnum.AdditionalTrade));
|
|
|
|
var query = from td in DbContext.trade.Where(tdPredicate)
|
|
join r in DbContext.trade_contract_r.Where(rPredicate) on td.id equals r.TradeId into r_t
|
|
from r in r_t.DefaultIfEmpty()
|
|
join d in DbContext.trade_contract_document on r.ContractCode equals d.Code into d_t
|
|
from d in d_t.DefaultIfEmpty()
|
|
select new TradeContractDocFileExportInfo
|
|
{
|
|
TradeNumber = td.TradeNumber,
|
|
TradeStatus = td.TradeStatus,
|
|
ValueDate = td.TradeDate,
|
|
|
|
ContractCode = r.ContractCode,
|
|
|
|
FilePath = d.Paths,
|
|
FileName = d.FileName,
|
|
StampDocumentFileName = d.StampDocumentFileName
|
|
};
|
|
|
|
//DbContext.SetDebugLog();
|
|
|
|
exportInfos = query.ToArray();
|
|
|
|
var zipEntryList = new List<MyZipEntry>(exportInfos.Length + 1);
|
|
|
|
foreach (var info in exportInfos)
|
|
{
|
|
if (PS.Config.ErpElement.ConfirmBookStampStatus
|
|
&& !string.IsNullOrWhiteSpace(info.StampDocumentFileName))
|
|
{
|
|
var filePath = TradeContractHelper.GetPhysicalPath(info.StampDocumentFileName);
|
|
|
|
if (File.Exists(filePath))
|
|
{
|
|
var entry = MyZipEntry.Create(filePath);
|
|
|
|
zipEntryList.Add(entry);
|
|
|
|
info.FileName = entry.Name;
|
|
}
|
|
else
|
|
{
|
|
info.ErrorMsg = "已用印交易确认书文件不存在";
|
|
}
|
|
}
|
|
else
|
|
{
|
|
var filePath = TradeContractHelper.GetAbsolutePath(info.FilePath, info.FileName);
|
|
|
|
if (File.Exists(filePath))
|
|
{
|
|
var entry = MyZipEntry.Create(filePath);
|
|
|
|
zipEntryList.Add(entry);
|
|
|
|
info.FileName = entry.Name;
|
|
}
|
|
else
|
|
{
|
|
info.ErrorMsg = "交易确认书文件不存在";
|
|
}
|
|
}
|
|
}
|
|
|
|
zipEntryList.Add(new MyZipEntry
|
|
{
|
|
Name = "info.txt",
|
|
Buffer = Encoding.UTF8.GetBytes(JsonBeautify.Serialize(exportInfos))
|
|
});
|
|
|
|
return ZipFileHelper.ZipFiles(zipEntryList);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 生成了结确认书批量导出文件
|
|
/// </summary>
|
|
public byte[] GetZipFileOfCloseDocs(OtcTradeContractCloseDocExportRequest req, out TradeContractDocFileExportInfo[] exportInfos)
|
|
{
|
|
if (req is null)
|
|
{
|
|
throw new ArgumentNullException(nameof(req));
|
|
}
|
|
|
|
int[] clientIds = null;
|
|
|
|
if (req.ClientNumbers != null && req.ClientNumbers.Any())
|
|
{
|
|
clientIds = DataCacheProvider.GetClientDataSource().AsQueryable()
|
|
.Where(n => req.ClientNumbers.Contains(n.Number))
|
|
.Select(n => n.id).ToArray();
|
|
}
|
|
|
|
var tdPredicate = PredicateBuilder.Create<trade>(td => td.ValidState != ConsGlobal.InValid && ("结构化交易" != td.TradeType || td.IsGroup == 1) && td.IsGroup != 2);
|
|
|
|
if (req.TradeNumbers != null && req.TradeNumbers.Any())
|
|
{
|
|
tdPredicate = tdPredicate.And(td => req.TradeNumbers.Contains(td.TradeNumber));
|
|
}
|
|
|
|
if (clientIds != null)
|
|
{
|
|
tdPredicate = tdPredicate.And(td => clientIds.Contains(td.ClientId));
|
|
}
|
|
|
|
var actionList = new string[] { ClientCashInCashOut.系统操作_行权费, ClientCashInCashOut.系统操作_平仓费, ClientCashInCashOut.系统操作_互换, ClientCashInCashOut.系统操作_票息 };
|
|
var tcPredicate = PredicateBuilder.Create<trade_cash>(tc => actionList.Contains(tc.Action) && tc.ValidState != ConsGlobal.InValid && !tc.IsDeleted && tc.ValueDate >= req.CloseDateRangeStart);
|
|
|
|
if (req.CloseDateRangeEnd.HasValue)
|
|
{
|
|
tcPredicate = tcPredicate.And(tc => tc.ValueDate <= req.CloseDateRangeEnd.Value);
|
|
}
|
|
|
|
var rPredicate = PredicateBuilder.Create<trade_contract_r>(r => r.IsValid && (r.Type == ContractTypeEnum.Clearing || r.Type == ContractTypeEnum.UnWind));
|
|
|
|
var query = from tc in DbContext.trade_cash.Where(tcPredicate)
|
|
join td in DbContext.trade.Where(tdPredicate) on tc.TradeId equals td.id
|
|
join r in DbContext.trade_contract_r.Where(rPredicate) on new { tc.TradeId, tcId = tc.id } equals new { r.TradeId, tcId = r.TradeCashId.Value } into r_t
|
|
from r in r_t.DefaultIfEmpty()
|
|
join doc in DbContext.trade_contract_document on new { Code = r.ContractCode, r.Type } equals new { doc.Code, doc.Type } into doc_t
|
|
from doc in doc_t.DefaultIfEmpty()
|
|
select new TradeContractDocFileExportInfo
|
|
{
|
|
ValueDate = tc.ValueDate,
|
|
|
|
TradeNumber = td.TradeNumber,
|
|
TradeStatus = td.TradeStatus,
|
|
|
|
ContractCode = r.ContractCode,
|
|
|
|
FilePath = doc.Paths,
|
|
FileName = doc.FileName,
|
|
StampDocumentFileName = null
|
|
};
|
|
|
|
//DbContext.SetDebugLog();
|
|
|
|
exportInfos = query.ToArray();
|
|
|
|
var zipEntryList = new List<MyZipEntry>(exportInfos.Length + 1);
|
|
|
|
foreach (var info in exportInfos)
|
|
{
|
|
var path = info.FilePath;
|
|
|
|
if (string.IsNullOrWhiteSpace(path))
|
|
{
|
|
info.ErrorMsg = "确认书文件不存在";
|
|
}
|
|
else
|
|
{
|
|
var filePath = GetFileName(path, ".pdf");
|
|
|
|
if (string.IsNullOrEmpty(path))
|
|
{
|
|
filePath = GetFileName(path, ".doc");
|
|
}
|
|
|
|
if (File.Exists(filePath))
|
|
{
|
|
var entry = MyZipEntry.Create(filePath);
|
|
|
|
zipEntryList.Add(entry);
|
|
|
|
info.FileName = entry.Name;
|
|
}
|
|
else
|
|
{
|
|
info.ErrorMsg = "确认书文件不存在";
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
zipEntryList.Add(new MyZipEntry
|
|
{
|
|
Name = "info.txt",
|
|
Buffer = Encoding.UTF8.GetBytes(JsonBeautify.Serialize(exportInfos))
|
|
});
|
|
|
|
return ZipFileHelper.ZipFiles(zipEntryList);
|
|
}
|
|
|
|
private static 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 (!File.Exists(fName))
|
|
{
|
|
fName += "x"; //解决数据库中存的后缀名是doc但实际文件是docx的问题;
|
|
}
|
|
|
|
return File.Exists(fName) ? fName : null;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 交易确认书文档导出信息
|
|
/// </summary>
|
|
public class TradeContractDocFileExportInfo
|
|
{
|
|
/// <summary>
|
|
/// 交易编号
|
|
/// </summary>
|
|
public string TradeNumber { get; set; }
|
|
|
|
/// <summary>
|
|
/// 交易当前状态
|
|
/// </summary>
|
|
public string TradeStatus { get; set; }
|
|
|
|
/// <summary>
|
|
/// 开平仓日期
|
|
/// </summary>
|
|
public DateTime? ValueDate { get; set; }
|
|
|
|
/// <summary>
|
|
/// 合约编号
|
|
/// </summary>
|
|
public string ContractCode { get; set; }
|
|
|
|
/// <summary>
|
|
/// 文件名称
|
|
/// </summary>
|
|
public string FileName { get; set; }
|
|
|
|
/// <summary>
|
|
/// 错误信息
|
|
/// </summary>
|
|
public string ErrorMsg { get; set; }
|
|
|
|
internal string FilePath { get; set; }
|
|
|
|
internal string StampDocumentFileName { get; set; }
|
|
|
|
public override string ToString()
|
|
{
|
|
return $"{TradeNumber}-{ErrorMsg}";
|
|
}
|
|
}
|
|
}
|