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("定义文件债券勾选", "□"); // 利率类型勾选框(同模板内另一处 ☑/□ 占位符),一并驱动以便预览完整 varDic.SetVar("IsFixed", isNafmii ? "□" : "☑"); varDic.SetVar("IsFloat", isNafmii ? "☑" : "□"); 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勾选}}"), "协议段占位符应全部被替换"); } } }