diff --git a/Plugins/YLErp.Plugins.GuoLian/App_Docs/contract_template/国联民生-收益互换交易确认书-境内模板-【客户看多】-【债券ETF】-清洁版.docx b/Plugins/YLErp.Plugins.GuoLian/App_Docs/contract_template/国联民生-收益互换交易确认书-境内模板-【客户看多】-【债券ETF】-清洁版.docx
index 030e6c1c..7a9fb1fa 100644
Binary files a/Plugins/YLErp.Plugins.GuoLian/App_Docs/contract_template/国联民生-收益互换交易确认书-境内模板-【客户看多】-【债券ETF】-清洁版.docx and b/Plugins/YLErp.Plugins.GuoLian/App_Docs/contract_template/国联民生-收益互换交易确认书-境内模板-【客户看多】-【债券ETF】-清洁版.docx differ
diff --git a/Plugins/YLErp.Plugins.GuoLian/App_Docs/contract_template/国联民生-收益互换交易确认书-境内模板-【客户看多】-【现券】-清洁版.docx b/Plugins/YLErp.Plugins.GuoLian/App_Docs/contract_template/国联民生-收益互换交易确认书-境内模板-【客户看多】-【现券】-清洁版.docx
index f1f7c61e..e90fceee 100644
Binary files a/Plugins/YLErp.Plugins.GuoLian/App_Docs/contract_template/国联民生-收益互换交易确认书-境内模板-【客户看多】-【现券】-清洁版.docx and b/Plugins/YLErp.Plugins.GuoLian/App_Docs/contract_template/国联民生-收益互换交易确认书-境内模板-【客户看多】-【现券】-清洁版.docx differ
diff --git a/Plugins/YLErp.Plugins.GuoLian/App_Docs/contract_template/国联民生-收益互换交易确认书-境内模板-【客户看空】-【债券ETF】-清洁版.docx b/Plugins/YLErp.Plugins.GuoLian/App_Docs/contract_template/国联民生-收益互换交易确认书-境内模板-【客户看空】-【债券ETF】-清洁版.docx
index c6da85b2..f83854bc 100644
Binary files a/Plugins/YLErp.Plugins.GuoLian/App_Docs/contract_template/国联民生-收益互换交易确认书-境内模板-【客户看空】-【债券ETF】-清洁版.docx and b/Plugins/YLErp.Plugins.GuoLian/App_Docs/contract_template/国联民生-收益互换交易确认书-境内模板-【客户看空】-【债券ETF】-清洁版.docx differ
diff --git a/Plugins/YLErp.Plugins.GuoLian/App_Docs/contract_template/国联民生-收益互换交易确认书-境内模板-【客户看空】-【现券】-清洁版.docx b/Plugins/YLErp.Plugins.GuoLian/App_Docs/contract_template/国联民生-收益互换交易确认书-境内模板-【客户看空】-【现券】-清洁版.docx
index 19243728..b89c9ac5 100644
Binary files a/Plugins/YLErp.Plugins.GuoLian/App_Docs/contract_template/国联民生-收益互换交易确认书-境内模板-【客户看空】-【现券】-清洁版.docx and b/Plugins/YLErp.Plugins.GuoLian/App_Docs/contract_template/国联民生-收益互换交易确认书-境内模板-【客户看空】-【现券】-清洁版.docx differ
diff --git a/Plugins/YLErp.Plugins.GuoLian/DocumentGenerator/TradeConfirmationGenerator.cs b/Plugins/YLErp.Plugins.GuoLian/DocumentGenerator/TradeConfirmationGenerator.cs
index d7d32888..e626cb4b 100644
--- a/Plugins/YLErp.Plugins.GuoLian/DocumentGenerator/TradeConfirmationGenerator.cs
+++ b/Plugins/YLErp.Plugins.GuoLian/DocumentGenerator/TradeConfirmationGenerator.cs
@@ -8,6 +8,7 @@ using YLErp.Modules.MarginModule;
using YLErp.Modules.UnderlyingModule;
using YLErp.Plugins.TradeDocGenerator;
using YLErp.Plugins.TradeDocGenerator.Abstracts;
+using YieldChain.Helpers;
namespace YLErp.Plugins.GuoLian.DocumentGenerator
{
@@ -245,11 +246,26 @@ namespace YLErp.Plugins.GuoLian.DocumentGenerator
}
dic["主协议编号"] = mainProtocolCode ?? "";
- // 主协议类型:仅 NAFMII 使用中国银行间市场协议,其余类型按 SAC 展示。
+ // 主协议类型取客户开户维护的下拉选择(client_meta.MainProtocolType):1=NAFMII,其余按 SAC。
var mainProtocolType = Context.GetClientMeta(client.id, "MainProtocolType")?.MetaValue;
var isNafmii = mainProtocolType == "1";
- dic["IsSac"] = !isNafmii;
- dic["IsNafmii"] = isNafmii;
+ if (string.IsNullOrWhiteSpace(mainProtocolType))
+ {
+ LogFactory.GetLogger("确认书生成").Info($"客户 {client.Number} {client.Name} 未维护主协议类型,确认书协议段按 SAC 勾选展示");
+ }
+
+ // 协议段勾选框对应模板占位符,按客户签署的主协议类型动态勾选,替代模板中硬编码的 Wingdings 2 复选框
+ static string Check(bool on) => on ? "☑" : "□";
+ dic["主协议SAC勾选"] = Check(!isNafmii);
+ dic["主协议NAFMII勾选"] = Check(isNafmii);
+ dic["补充协议SAC勾选"] = Check(!isNafmii);
+ dic["补充协议NAFMII勾选"] = Check(isNafmii);
+ // 定义文件签署维度暂无客户协议数据,统一展示空框,待客户资料补齐后接入
+ dic["协会证券业勾选"] = "□";
+ dic["协会交易商勾选"] = "□";
+ dic["定义文件商品勾选"] = "□";
+ dic["定义文件利率勾选"] = "□";
+ dic["定义文件债券勾选"] = "□";
// 补充协议编号:优先取 client 表字段,为空时从 client_meta 表兜底
var supProtocolCode = client.SupProtocolCode;
diff --git a/UnitTestProject/PluginTests/TestGuoLianConfirmTemplate.cs b/UnitTestProject/PluginTests/TestGuoLianConfirmTemplate.cs
new file mode 100644
index 00000000..b06302f9
--- /dev/null
+++ b/UnitTestProject/PluginTests/TestGuoLianConfirmTemplate.cs
@@ -0,0 +1,86 @@
+using System.IO.Compression;
+using System.Text;
+using Newtonsoft.Json.Linq;
+using YLErp.Office.Converters;
+
+namespace YLErp.PluginTests
+{
+ ///
+ /// 国联确认书模板协议段勾选框占位符化后的渲染验证:
+ /// 客户开户维护的主协议类型(client_meta.MainProtocolType,1=NAFMII,其余 SAC)
+ /// 决定协议段 ☑/□ 勾选位置,模板不再依赖 Wingdings 2 硬编码复选框。
+ ///
+ [TestClass]
+ public class TestGuoLianConfirmTemplate
+ {
+ private static string TemplatePath =>
+ Path.Combine(AppContext.BaseDirectory, "..\\..\\..\\..\\Plugins\\YLErp.Plugins.GuoLian\\App_Docs\\contract_template",
+ "国联民生-收益互换交易确认书-境内模板-【客户看多】-【现券】-清洁版.docx");
+
+ private static string OutputDir => Path.Combine(AppContext.BaseDirectory, "TestOutputs");
+
+ private static JsonVarDic BuildVarDic(bool isNafmii)
+ {
+ var varDic = new JsonVarDic();
+ varDic.SetVar("合同编号", "GL-20260827-001");
+ varDic.SetVar("客户名称", "测试客户");
+ varDic.SetVar("主协议编号", "GL-ZU-2026-001");
+ varDic.SetVar("补充协议编号", "GL-BC-2026-001");
+
+ static string Check(bool on) => on ? "☑" : "□";
+ varDic.SetVar("主协议SAC勾选", Check(!isNafmii));
+ varDic.SetVar("主协议NAFMII勾选", Check(isNafmii));
+ varDic.SetVar("补充协议SAC勾选", Check(!isNafmii));
+ varDic.SetVar("补充协议NAFMII勾选", Check(isNafmii));
+ varDic.SetVar("协会证券业勾选", "□");
+ varDic.SetVar("协会交易商勾选", "□");
+ varDic.SetVar("定义文件商品勾选", "□");
+ varDic.SetVar("定义文件利率勾选", "□");
+ varDic.SetVar("定义文件债券勾选", "□");
+ return varDic;
+ }
+
+ private static string RenderAndReadBody(bool isNafmii, string fileName)
+ {
+ Directory.CreateDirectory(OutputDir);
+ var targetPath = Path.Combine(OutputDir, fileName);
+ OfficeFileConverter.ConvertByUsingDocTemplate(TemplatePath, targetPath, BuildVarDic(isNafmii));
+
+ using var zip = ZipFile.OpenRead(targetPath);
+ var entry = zip.GetEntry("word/document.xml");
+ using var stream = entry.Open();
+ using var reader = new StreamReader(stream, Encoding.UTF8);
+ var xml = reader.ReadToEnd();
+
+ // 勾选框与协议名称分属不同 run,断言前拼接纯文本
+ var plainText = new StringBuilder();
+ foreach (System.Text.RegularExpressions.Match m in System.Text.RegularExpressions.Regex.Matches(xml, @"]*>(.*?)"))
+ {
+ plainText.Append(m.Groups[1].Value);
+ }
+ return plainText.ToString();
+ }
+
+ [TestMethod("测试-国联确认书-SAC客户协议段勾选")]
+ public void TestSacAgreementChecked()
+ {
+ var body = RenderAndReadBody(isNafmii: false, "guolian_confirm_sac.docx");
+
+ Assert.IsTrue(body.Contains("☑《中国证券期货市场衍生品交易主协议》/"), "SAC 客户主协议应勾选 SAC");
+ Assert.IsTrue(body.Contains("□《中国银行间市场金融衍生产品交易主协议(2009年版)》"), "SAC 客户主协议不应勾选 NAFMII");
+ Assert.IsTrue(body.Contains("☑《中国证券期货市场衍生品交易主协议》补充协议"), "SAC 客户补充协议应勾选 SAC");
+ Assert.IsFalse(body.Contains("{{主协议SAC勾选}}"), "协议段占位符应全部被替换");
+ }
+
+ [TestMethod("测试-国联确认书-NAFMII客户协议段勾选")]
+ public void TestNafmiiAgreementChecked()
+ {
+ var body = RenderAndReadBody(isNafmii: true, "guolian_confirm_nafmii.docx");
+
+ Assert.IsTrue(body.Contains("□《中国证券期货市场衍生品交易主协议》/"), "NAFMII 客户主协议不应勾选 SAC");
+ Assert.IsTrue(body.Contains("☑《中国银行间市场金融衍生产品交易主协议(2009年版)》"), "NAFMII 客户主协议应勾选 NAFMII");
+ Assert.IsTrue(body.Contains("☑《中国银行间市场金融衍生产品交易主协议(2009年版)补充协议》"), "NAFMII 客户补充协议应勾选 NAFMII");
+ Assert.IsFalse(body.Contains("{{主协议NAFMII勾选}}"), "协议段占位符应全部被替换");
+ }
+ }
+}