From d1f697c524bb114b5fd2fc04eb0260ca98f05bfb Mon Sep 17 00:00:00 2001 From: tengyufan <1532636164@qq.com> Date: Wed, 29 Jul 2026 17:14:40 +0800 Subject: [PATCH] =?UTF-8?q?#EQD-6604=20=E5=9B=BD=E8=81=94=E6=B0=91?= =?UTF-8?q?=E7=94=9F-=E7=A1=AE=E8=AE=A4=E4=B9=A6=E7=BC=96=E7=A0=81?= =?UTF-8?q?=E7=94=9F=E6=88=90=E7=8E=AF=E8=8A=82=E7=A7=BB=E5=88=B0=E7=B0=BF?= =?UTF-8?q?=E8=AE=B0=EF=BC=88=E6=94=AF=E6=8C=81=E6=89=8B=E5=B7=A5=E5=BD=95?= =?UTF-8?q?=E5=85=A5=EF=BC=89=20feat:=20=E5=9B=BD=E8=81=94=E6=B0=91?= =?UTF-8?q?=E7=94=9F=E6=94=B6=E7=9B=8A=E4=BA=92=E6=8D=A2=E7=B0=BF=E8=AE=B0?= =?UTF-8?q?=E5=90=8E=E6=8C=89=E7=A1=AE=E8=AE=A4=E4=B9=A6=E8=A7=84=E5=88=99?= =?UTF-8?q?=E7=94=9F=E6=88=90=E4=BA=A4=E6=98=93=E7=BC=96=20-=20=E8=A1=A5?= =?UTF-8?q?=E5=85=85=E5=8D=95=E6=B5=8B=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GuolianContractNoGeneratorTest.cs | 70 +++++++++++++++++++ .../GuolianContractNoGenerator.cs | 18 ++++- 2 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 UnitTestProject/Modules/TradeModule/DocGenerateModule/GuolianContractNoGeneratorTest.cs 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); + } + /// /// 交易首次入库后按国联交易确认书编号规则回写交易编号。 ///