生成的确认书中 ☑/□ 占位符继承模板楷体,楷体无 U+2611/U+25A1 字形, Word 按字体回退渲染导致符号与周围文字大小不一。 - 模板中 11 处勾选框占位符 run(协议段 9 处 + 利率类型 IsFixed/IsFloat 2 处) 显式指定 Segoe UI Symbol 并将字号由 24 调至 28 对齐楷体正文视觉高度 - 嵌在长文本 run 中的占位符(主协议NAFMII勾选、IsFixed/IsFloat)拆分为 独立 run,使前后文字保持楷体、符号单独设字体 - 渲染测试补充 IsFixed/IsFloat 驱动,产物 11 处勾选框均验证为符号字体
90 lines
4.7 KiB
C#
90 lines
4.7 KiB
C#
using System.IO.Compression;
|
||
using System.Text;
|
||
using Newtonsoft.Json.Linq;
|
||
using YLErp.Office.Converters;
|
||
|
||
namespace YLErp.PluginTests
|
||
{
|
||
/// <summary>
|
||
/// 国联确认书模板协议段勾选框占位符化后的渲染验证:
|
||
/// 客户开户维护的主协议类型(client_meta.MainProtocolType,1=NAFMII,其余 SAC)
|
||
/// 决定协议段 ☑/□ 勾选位置,模板不再依赖 Wingdings 2 硬编码复选框。
|
||
/// </summary>
|
||
[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, @"<w:t[^>]*>(.*?)</w:t>"))
|
||
{
|
||
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勾选}}"), "协议段占位符应全部被替换");
|
||
}
|
||
}
|
||
}
|