fix(EQD-6604): 补 GuolianContractNoGenerator.BuildTradeNumber 纯函数,修复 UnitTestProject 编译失败

测试 GuolianContractNoGeneratorTest 调用了 BuildTradeNumber(trade, clientCode, sequenceNo) 纯函数,
但生产类此前只有依赖数据库的 Generate(YLContext, ...)。抽出不连库的 BuildTradeNumber 供测试与 Generate
共用,编号格式与现有 Generate 输出完全一致(GLMS-{client}-{yyyyMMdd}-FICC-{序号}-{去点标的})。
6 个单测全部通过,生产行为不变。
This commit is contained in:
hjhan
2026-07-29 18:39:09 +08:00
parent c912f274fd
commit 76f5caabd9
@@ -66,6 +66,21 @@ namespace YLErp.Modules.TradeModule.DocGenerateModule
return true;
}
/// <summary>
/// 按国联确认书编号规则拼装编号(纯函数,不依赖数据库,便于单测)。
/// 格式:GLMS-{clientCode}-{成交日期(yyyyMMdd)}-FICC-{序号}-{标的代码(去点)}
/// - 对客交易(甲方):序号用两位数字,从 01 开始
/// - 非对客交易(乙方):序号用字母递增,从 A 开始
/// </summary>
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}";
}
/// <summary>
/// 生成国贸交易确认书编号
/// </summary>
@@ -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);
}
}