From 76f5caabd9db2402598ab525ed7770184a928843 Mon Sep 17 00:00:00 2001 From: hjhan Date: Wed, 29 Jul 2026 18:39:09 +0800 Subject: [PATCH] =?UTF-8?q?fix(EQD-6604):=20=E8=A1=A5=20GuolianContractNoG?= =?UTF-8?q?enerator.BuildTradeNumber=20=E7=BA=AF=E5=87=BD=E6=95=B0?= =?UTF-8?q?=EF=BC=8C=E4=BF=AE=E5=A4=8D=20UnitTestProject=20=E7=BC=96?= =?UTF-8?q?=E8=AF=91=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 测试 GuolianContractNoGeneratorTest 调用了 BuildTradeNumber(trade, clientCode, sequenceNo) 纯函数, 但生产类此前只有依赖数据库的 Generate(YLContext, ...)。抽出不连库的 BuildTradeNumber 供测试与 Generate 共用,编号格式与现有 Generate 输出完全一致(GLMS-{client}-{yyyyMMdd}-FICC-{序号}-{去点标的})。 6 个单测全部通过,生产行为不变。 --- .../GuolianContractNoGenerator.cs | 29 ++++++++++--------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/YLErpDAL/Modules/TradeModule/DocGenerateModule/GuolianContractNoGenerator.cs b/YLErpDAL/Modules/TradeModule/DocGenerateModule/GuolianContractNoGenerator.cs index 1d03dde8..b1d666a0 100644 --- a/YLErpDAL/Modules/TradeModule/DocGenerateModule/GuolianContractNoGenerator.cs +++ b/YLErpDAL/Modules/TradeModule/DocGenerateModule/GuolianContractNoGenerator.cs @@ -66,6 +66,21 @@ namespace YLErp.Modules.TradeModule.DocGenerateModule return true; } + /// + /// 按国联确认书编号规则拼装编号(纯函数,不依赖数据库,便于单测)。 + /// 格式:GLMS-{clientCode}-{成交日期(yyyyMMdd)}-FICC-{序号}-{标的代码(去点)} + /// - 对客交易(甲方):序号用两位数字,从 01 开始 + /// - 非对客交易(乙方):序号用字母递增,从 A 开始 + /// + public static string BuildTradeNumber(trade trade, string clientCode, int sequenceNo) + { + var isClientTrade = trade.OpponentRole == "甲方"; + var underlyingCode = (trade.UnderlyingCode ?? "").Replace(".", ""); // 去掉标的代码中的点号 + var tradeDateStr = (trade.TradeDate ?? DateTime.MinValue).ToString("yyyyMMdd"); + var seq = isClientTrade ? sequenceNo.ToString("D2") : NumberToLetter(sequenceNo); + return $"GLMS-{clientCode}-{tradeDateStr}-FICC-{seq}-{underlyingCode}"; + } + /// /// 生成国贸交易确认书编号 /// @@ -78,12 +93,7 @@ namespace YLErp.Modules.TradeModule.DocGenerateModule trade trade, string clientCode) { - // 根据trade的OpponentRole判断是否为对客交易(甲方=对客)。glms客户规定甲方=对客 - var isClientTrade = trade.OpponentRole == "甲方"; - var underlyingCode = (trade.UnderlyingCode ?? "").Replace(".", ""); // 去掉标的代码中的点号 var tradeDate = trade.TradeDate ?? DateTime.MinValue; - var tradeDateStr = tradeDate.ToString("yyyyMMdd"); - var prefix = $"GLMS-{clientCode}-{tradeDateStr}-FICC-"; lock (_syncLock) { @@ -108,14 +118,7 @@ namespace YLErp.Modules.TradeModule.DocGenerateModule && t.id < trade.id); var sequenceNo = sameDayTradesCount + 1; - if (isClientTrade) - { - return $"{prefix}{sequenceNo:D2}-{underlyingCode}"; - } - else - { - return $"{prefix}{NumberToLetter(sequenceNo)}-{underlyingCode}"; - } + return BuildTradeNumber(trade, clientCode, sequenceNo); } }