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

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