diff --git a/UnitTestProject/Modules/TradeModule/DocGenerateModule/GuolianContractNoGeneratorTest.cs b/UnitTestProject/Modules/TradeModule/DocGenerateModule/GuolianContractNoGeneratorTest.cs new file mode 100644 index 00000000..14580fd3 --- /dev/null +++ b/UnitTestProject/Modules/TradeModule/DocGenerateModule/GuolianContractNoGeneratorTest.cs @@ -0,0 +1,70 @@ +using YLErp.Configuration; +using YLErp.DBModels; +using YLErp.Modules.TradeModule.DocGenerateModule; + +namespace YLErp.UnitTestProject.Modules.TradeModule.DocGenerateModule +{ + [TestClass] + public class GuolianContractNoGeneratorTest + { + [TestMethod] + public void IsGuolianSwapTrade_OnlyMatchesGuolianSwap() + { + var swapTrade = CreateSwapTrade(); + + Assert.IsTrue(GuolianContractNoGenerator.IsGuolianSwapTrade(swapTrade, CompanyEnum.国联)); + Assert.IsFalse(GuolianContractNoGenerator.IsGuolianSwapTrade( + new trade { TradeType = "香草期权" }, CompanyEnum.国联)); + Assert.IsFalse(GuolianContractNoGenerator.IsGuolianSwapTrade(swapTrade, CompanyEnum.国泰君安)); + } + + [TestMethod] + public void ShouldGenerateTradeNumberAfterSave_OnlyGeneratesForBlankTradeNumber() + { + var blankTrade = CreateSwapTrade(); + var manualTrade = CreateSwapTrade(); + manualTrade.TradeNumber = "MANUAL-001"; + + Assert.IsTrue(GuolianContractNoGenerator.ShouldGenerateTradeNumberAfterSave( + blankTrade, CompanyEnum.国联)); + Assert.IsFalse(GuolianContractNoGenerator.ShouldGenerateTradeNumberAfterSave( + manualTrade, CompanyEnum.国联)); + Assert.IsFalse(GuolianContractNoGenerator.ShouldGenerateTradeNumberAfterSave( + blankTrade, CompanyEnum.国泰君安)); + } + + [TestMethod] + public void BuildTradeNumber_ClientTrade_UsesNumericSequenceAndSanitizesUnderlyingCode() + { + var trade = CreateSwapTrade(); + trade.OpponentRole = "甲方"; + trade.TradeDate = new DateTime(2026, 7, 24); + trade.UnderlyingCode = "250210.IB"; + + var number = GuolianContractNoGenerator.BuildTradeNumber(trade, "IS", 3); + + Assert.AreEqual("GLMS-IS-20260724-FICC-03-250210IB", number); + } + + [DataTestMethod] + [DataRow(1, "A")] + [DataRow(26, "Z")] + [DataRow(27, "AA")] + public void BuildTradeNumber_NonClientTrade_UsesLetterSequence(int sequenceNo, string sequenceCode) + { + var trade = CreateSwapTrade(); + trade.OpponentRole = "乙方"; + trade.TradeDate = new DateTime(2026, 7, 24); + trade.UnderlyingCode = "180205.IB"; + + var number = GuolianContractNoGenerator.BuildTradeNumber(trade, "glmscounter", sequenceNo); + + Assert.AreEqual($"GLMS-glmscounter-20260724-FICC-{sequenceCode}-180205IB", number); + } + + private static trade CreateSwapTrade() + { + return new trade { TradeType = "收益互换" }; + } + } +} diff --git a/YLErpDAL/Modules/TradeModule/DocGenerateModule/GuolianContractNoGenerator.cs b/YLErpDAL/Modules/TradeModule/DocGenerateModule/GuolianContractNoGenerator.cs index 5b858026..1d03dde8 100644 --- a/YLErpDAL/Modules/TradeModule/DocGenerateModule/GuolianContractNoGenerator.cs +++ b/YLErpDAL/Modules/TradeModule/DocGenerateModule/GuolianContractNoGenerator.cs @@ -20,10 +20,26 @@ namespace YLErp.Modules.TradeModule.DocGenerateModule public static bool IsGuolianSwapTrade(trade trade) { - return PS.Config.Company == CompanyEnum.国联 + return IsGuolianSwapTrade(trade, PS.Config.Company); + } + + public static bool IsGuolianSwapTrade(trade trade, CompanyEnum company) + { + return company == CompanyEnum.国联 && trade?.TradeType == "收益互换"; } + public static bool ShouldGenerateTradeNumberAfterSave(trade trade, CompanyEnum company) + { + return IsGuolianSwapTrade(trade, company) + && string.IsNullOrWhiteSpace(trade.TradeNumber); + } + + public static bool CanReuseRejectedTradeNumber(trade trade, CompanyEnum company) + { + return IsGuolianSwapTrade(trade, company); + } + /// /// 交易首次入库后按国联交易确认书编号规则回写交易编号。 ///