feature: 确认书模板修改

This commit is contained in:
张名锐
2026-06-09 13:38:10 +08:00
parent a6e6980f9b
commit 4e9b2d7b47
6 changed files with 160 additions and 62 deletions
@@ -8,8 +8,10 @@ namespace YLErp.Modules.TradeModule.DocGenerateModule
/// <summary>
/// 国贸交易确认书编号生成器
/// 规则:
/// - 对客交易(OpponentRole为"方"):GLMS-{对手方代码}-{成交日期(yyyyMMdd)}-{标的代码}-{当日第N笔对客交易(数字递增)},从001开始
/// - 非对客交易(OpponentRole为"乙方"):GLMS-{对手方代码}-{成交日期(yyyyMMdd)}-{标的代码}-{当日第N笔非对客交易(字母递增)},从A开始
/// - 对客交易(OpponentRole为"方"):GLMS-{对手方代码}-{成交日期(yyyyMMdd)}-{当日第N笔对客交易(数字递增)}-{标的代码},从01开始
/// 例:GLMS-IS-20260424-01-250210IB
/// - 非对客交易(OpponentRole为"甲方"):GLMS-{对手方代码}-{成交日期(yyyyMMdd)}-{当日第N笔非对客交易使用字母递增}-{标的代码},从A开始
/// 例:GLMS-IS-20260424-A-250210IB
/// </summary>
public class GuolianContractNoGenerator
{
@@ -27,12 +29,12 @@ namespace YLErp.Modules.TradeModule.DocGenerateModule
trade trade,
string clientCode)
{
// 根据trade的OpponentRole判断是否为对客交易
var isClientTrade = trade.OpponentRole == "方";
var underlyingCode = trade.UnderlyingCode ?? "";
// 根据trade的OpponentRole判断是否为对客交易(乙方=对客)
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}-{underlyingCode}-";
var prefix = $"GLMS-{clientCode}-{tradeDateStr}-";
lock (_syncLock)
{
@@ -63,62 +65,65 @@ namespace YLErp.Modules.TradeModule.DocGenerateModule
if (isClientTrade)
{
// 对客交易:GLMS-{clientCode}-{date}-{counter:D2}-{underlyingCode}
var maxNo = 0;
var prefixLen = prefix.Length;
for (var i = 0; i < existingCodes.Count; i++)
{
var code = existingCodes[i];
if (string.IsNullOrEmpty(code) || code.Length <= prefixLen)
if (string.IsNullOrEmpty(code) || code.Length <= prefixLen + 2)
{
continue;
}
var suffix = code.Substring(prefixLen);
if (int.TryParse(suffix, out var n) && n > maxNo)
var counterStr = code.Substring(prefixLen, 2);
if (int.TryParse(counterStr, out var n) && n > maxNo)
{
maxNo = n;
}
}
var nextNo = maxNo + 1;
var contractNo = $"{prefix}{nextNo:D3}";
var contractNo = $"{prefix}{nextNo:D2}-{underlyingCode}";
while (existingCodeSet.Contains(contractNo))
{
nextNo++;
contractNo = $"{prefix}{nextNo:D3}";
contractNo = $"{prefix}{nextNo:D2}-{underlyingCode}";
}
return contractNo;
}
else
{
var maxNo = 0;
// 非对客交易:GLMS-{clientCode}-{date}-{letter}-{underlyingCode}
// 找当日已有的非对客交易最大字母序号
var maxLetter = 0;
var prefixLen = prefix.Length;
for (var i = 0; i < existingCodes.Count; i++)
{
var code = existingCodes[i];
if (string.IsNullOrEmpty(code) || code.Length <= prefixLen)
if (string.IsNullOrEmpty(code) || code.Length <= prefixLen + 2)
{
continue;
}
var suffix = code.Substring(prefixLen);
if (!TryParseLettersToNumber(suffix, out var n))
var rest = code.Substring(prefixLen);
var dashIdx = rest.IndexOf('-');
if (dashIdx > 0)
{
continue;
}
if (n > maxNo)
{
maxNo = n;
var letterPart = rest.Substring(0, dashIdx);
if (TryParseLettersToNumber(letterPart, out var ln) && ln > maxLetter)
{
maxLetter = ln;
}
}
}
var nextNo = maxNo + 1;
var contractNo = $"{prefix}{NumberToLetter(nextNo)}";
var nextLetter = maxLetter + 1;
var contractNo = $"{prefix}{NumberToLetter(nextLetter)}-{underlyingCode}";
while (existingCodeSet.Contains(contractNo))
{
nextNo++;
contractNo = $"{prefix}{NumberToLetter(nextNo)}";
nextLetter++;
contractNo = $"{prefix}{NumberToLetter(nextLetter)}-{underlyingCode}";
}
return contractNo;
}