Files
zszq-trs/Plugins/YLErp.Plugins.GuoLian/DocumentGenerator/TradeUnwindReportGenerator.cs
T
hjhan 95ce3a3c8c fix(swap): 修复互换实时持仓服务异常处理和结算模块计算问题
- 添加try-catch块包装RealtimeSwapPosition调用以捕获异常
- 记录互换实时持仓服务计算失败的日志
- 修复结算模块金额计算中的空引用问题
- 为unwind百分比、原始名义金额和计数比率添加空值检查
2026-04-16 16:54:17 +08:00

143 lines
6.2 KiB
C#

using Newtonsoft.Json.Linq;
using YLErp.DBModels;
using YLErp.Plugins.TradeDocGenerator;
using YLErp.Plugins.TradeDocGenerator.Abstracts;
namespace YLErp.Plugins.GuoLian.DocumentGenerator
{
/// <summary>
/// 国联证券了结报告生成器
/// </summary>
internal class TradeUnwindReportGenerator : BaseUnwindReportGenerator, ITradeUnwindReportGenerator
{
protected override string GetContractNo(out string contractIndex)
{
var contractNo = Context.GenerateContractNo(out contractIndex);
return contractNo;
}
/// <summary>
/// 准备Word模板数据
/// </summary>
protected override void PrepareViewData(Dictionary<string, JToken> dic)
{
var table1 = new JArray();
var trade = Context.Trade;
var client = Context.GetClient();
var valueTimeList = new List<DateTime>();
var underlying = Context.GetTradeUnderlying();
var tradeCash = Context.GetTradeCash();
var tradeList = Context.Trades.Union(Context.SubTrades).ToList();
foreach (var item in Context.Trades)
{
foreach (var tradeCashItem in Context.TradeCashes[item.id])
{
var settlementPrice = (trade.IsUsePremiumRate != null && trade.IsUsePremiumRate.Value
? tradeCashItem.UnwindPricePercentRate.OtcFormatPercent()
: tradeCashItem.UnwindPrice.OtcFormatMoney());
var row = new JObject();
var currentTrade = tradeList.Find(o => o.id == tradeCashItem.TradeId);
row["交易编号"] = currentTrade?.TradeNumber ?? "";
// 买卖方向处理
switch (item.BuySell)
{
case "买入":
row["买方"] = (trade.OpponentRole == null || trade.OpponentRole == "乙方") ? "甲方" : "乙方";
break;
case "卖出":
row["买方"] = (trade.OpponentRole == null || trade.OpponentRole == "乙方") ? "乙方" : "甲方";
break;
default:
row["买方"] = "";
break;
}
row["交易日期"] = currentTrade?.TradeDate?.ToString("yyyy/MM/dd") ?? "";
row["开始日期"] = $"{currentTrade?.StartDate:yyyy/MM/dd}-{currentTrade?.ExerciseDate:yyyy/MM/dd}";
row["名义本金"] = currentTrade?.OriginalStockEqvNotional.OtcFormatMoney() ?? "0.00";
row["标的代码"] = currentTrade?.UnderlyingCode ?? "";
row["期权类型"] = currentTrade?.TradeType ?? "";
row["期初价格"] = currentTrade?.TradePrice.OtcFormatMoney() ?? "0.00";
row["结算日期"] = tradeCashItem.ValueDate.ToString("yyyy/MM/dd");
row["结算价格"] = tradeCashItem.FinalPrice.OtcFormatMoney();
row["结算模块"] = ((tradeCashItem.UnwindPercentRate ?? 0) * (currentTrade?.OriginalNotional ?? 0) * (underlying?.CountRatio ?? 0)).OtcFormatMoney() ?? "0.00";
row["结算单价"] = settlementPrice;
var amountQrs = -tradeCashItem.Amount;
var amountQrs2 = -(tradeCashItem.Amount + (currentTrade?.TradePrice ?? 0) * (tradeCashItem.UnwindPercentRate ?? 0) * ((currentTrade?.BuySell == "卖出") ? 1 : -1));
row["结算期权费"] = amountQrs.OtcFormatMoney();
row["结算金额"] = amountQrs2.OtcFormatMoney();
table1.Add(row);
valueTimeList.Add(tradeCashItem.ValueDate);
}
}
// 合同编号由基类统一设置,此处不再重复生成
dic["table1"] = table1;
dic["合同日期"] = DateTime.Now.ToString("yyyy/MM/dd");
dic["了结日期1"] = valueTimeList.Min().ToString("yyyy/MM/dd");
dic["了结日期2"] = valueTimeList.Max().ToString("yyyy/MM/dd");
// 甲乙方信息
var ownerInfo = Context.GetOwner_info("默认");
dic["客户名称"] = client?.Name ?? "";
dic["公司名称"] = ownerInfo?.FullName ?? "";
if (trade.OpponentRole == null || trade.OpponentRole == "乙方")
{
dic["甲方"] = ownerInfo?.FullName ?? "";
dic["乙方"] = client?.Name ?? "";
}
else
{
dic["甲方"] = client?.Name ?? "";
dic["乙方"] = ownerInfo?.FullName ?? "";
}
}
/// <summary>
/// 获取模板文件路径
/// </summary>
protected override string GetTemplateFilePath()
{
var templatePath = Path.Combine(GlobalConfig.PluginFolder, "App_Docs\\settlement_template\\unwind_01.docx");
return templatePath;
}
/// <summary>
/// 获取输出文件名
/// </summary>
protected override string GetOutputFileName(string contractNo, string contractIndex)
{
var client = Context.GetClient();
var trade = Context.Trade;
var tradeList = Context.Trades.Union(Context.SubTrades).ToList();
var ownerInfo = Context.GetOwner_info("默认") ?? new Owner_info();
var maxTradeDate = tradeList.Max(m => m.TradeDate);
var minTradeDate = tradeList.Min(m => m.TradeDate);
string date;
if (maxTradeDate == minTradeDate)
{
date = trade.TradeDate?.ToString("yyyyMMdd") ?? DateTime.Now.ToString("yyyyMMdd");
}
else
{
date = $"{minTradeDate:yyyyMMdd}-{maxTradeDate:yyyyMMdd}";
}
var fullName = ownerInfo?.FullName ?? "";
var rule = $"{fullName} {trade.TradeType}结算确认书 {date}";
Context.GetcontractIndex(rule, out var contractIndex2);
return $"{rule}-{contractIndex2}.{DocType.ToLower()}";
}
}
}