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勾选}}"), "协议段占位符应全部被替换"); + } + } +}