Files
zszq-trs/UnitTestProject/PluginTests/TestGuoLianConfirmTemplate.cs
hjhan 08d374a418 fix: 确认书勾选框渲染观感——占位符run显式指定符号字体
生成的确认书中 ☑/□ 占位符继承模板楷体,楷体无 U+2611/U+25A1 字形,
Word 按字体回退渲染导致符号与周围文字大小不一。

- 模板中 11 处勾选框占位符 run(协议段 9 处 + 利率类型 IsFixed/IsFloat 2 处)
  显式指定 Segoe UI Symbol 并将字号由 24 调至 28 对齐楷体正文视觉高度
- 嵌在长文本 run 中的占位符(主协议NAFMII勾选、IsFixed/IsFloat)拆分为
  独立 run,使前后文字保持楷体、符号单独设字体
- 渲染测试补充 IsFixed/IsFloat 驱动,产物 11 处勾选框均验证为符号字体
2026-08-27 14:09:09 +08:00

90 lines
4.7 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System.IO.Compression;
using System.Text;
using Newtonsoft.Json.Linq;
using YLErp.Office.Converters;
namespace YLErp.PluginTests
{
/// <summary>
/// 国联确认书模板协议段勾选框占位符化后的渲染验证:
/// 客户开户维护的主协议类型(client_meta.MainProtocolType1=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勾选}}"), "协议段占位符应全部被替换");
}
}
}