From 864a29d6a82ccc4d97e11ac5d786b9ccc3bbc1eb Mon Sep 17 00:00:00 2001 From: tengyufan <1532636164@qq.com> Date: Wed, 5 Aug 2026 15:55:01 +0800 Subject: [PATCH] =?UTF-8?q?#EQD-6605=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=E5=8F=B7?= =?UTF-8?q?=E8=A7=84=E5=88=99=E8=B0=83=E6=95=B4=EF=BC=88=E4=B8=8D=E5=9F=BA?= =?UTF-8?q?=E4=BA=8E=E7=94=B2=E6=96=B9=E4=B9=99=E6=96=B9=E5=88=A4=E5=AE=9A?= =?UTF-8?q?=EF=BC=89=20feat:=20=E5=9B=BD=E8=81=94=E6=B0=91=E7=94=9F?= =?UTF-8?q?=E6=94=B6=E7=9B=8A=E4=BA=92=E6=8D=A2=E6=8C=89=E7=B0=BF=E8=AE=B0?= =?UTF-8?q?=E5=88=86=E7=B1=BB=E7=94=9F=E6=88=90=E4=BA=A4=E6=98=93=E7=BC=96?= =?UTF-8?q?=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 簿记账户新增“簿记分类”字段,支持代客、融券,新增账户默认代客,历史账户统一初始化为代客 簿记账户分类设为必填,列表、编辑及详情页面同步展示 修改已被交易引用的簿记账户分类时增加二次确认,并提示关联交易数量 国联民生收益互换交易编号不再根据甲乙方判断,改为根据簿记账户分类生成 代客使用数字序号,融券使用字母序号,分别从已有同客户同日编号的最大序号继续递增 保留手工交易编号优先逻辑,标准格式的手工编号参与后续最大序号计算 生成候选编号后检查完整交易编号是否已存在,存在则继续递增 新增簿记分类编号格式、最大序号计算及数字字母序列隔离专项单测 --- Framework/YLErp.Core/DBModels/Assetunit.cs | 6 + .../GuolianContractNoGeneratorTest.cs | 107 ++++++++++++- .../BasicDataModule/AssetUnitDataService.cs | 28 ++++ .../ExchangeTradeSaveService.cs | 2 +- .../Modules/SwapModule/SwapTradeService.cs | 2 +- .../GuolianContractNoGenerator.cs | 148 ++++++++++++++++-- .../OrderModule/TradeSavePreHandler.cs | 4 +- YLErpWeb/Controllers/assetunitController.cs | 17 +- YLErpWeb/Views/assetunit/assetunitEdit.cshtml | 10 +- YLErpWeb/Views/assetunit/assetunitList.cshtml | 1 + YLErpWeb/Views/assetunit/assetunitView.cshtml | 6 +- .../Scripts/app/basic/assetunitEdit.js | 11 +- 12 files changed, 310 insertions(+), 32 deletions(-) diff --git a/Framework/YLErp.Core/DBModels/Assetunit.cs b/Framework/YLErp.Core/DBModels/Assetunit.cs index cecec22d..1a30ead5 100644 --- a/Framework/YLErp.Core/DBModels/Assetunit.cs +++ b/Framework/YLErp.Core/DBModels/Assetunit.cs @@ -9,6 +9,9 @@ namespace YLErp.DBModels [Table("assetunit")] public class AssetUnit : DBModelWithOperator, IDataEntity, IDataTraceV2, IClonable { + public const string BookCategoryAgency = "代客"; + public const string BookCategorySecuritiesLending = "融券"; + [Key] [DisplayName("簿记账户名称")] public override int id { get; set; } @@ -55,6 +58,9 @@ namespace YLErp.DBModels [DisplayName("簿记账户名称"), Required] public string Name { get; set; } + [DisplayName("簿记分类"), Required] + public string BookCategory { get; set; } + /// /// 基础币种 /// diff --git a/UnitTestProject/Modules/TradeModule/DocGenerateModule/GuolianContractNoGeneratorTest.cs b/UnitTestProject/Modules/TradeModule/DocGenerateModule/GuolianContractNoGeneratorTest.cs index 28e41c9d..31650f8b 100644 --- a/UnitTestProject/Modules/TradeModule/DocGenerateModule/GuolianContractNoGeneratorTest.cs +++ b/UnitTestProject/Modules/TradeModule/DocGenerateModule/GuolianContractNoGeneratorTest.cs @@ -47,14 +47,14 @@ namespace YLErp.UnitTestProject.Modules.TradeModule.DocGenerateModule } [TestMethod] - public void BuildTradeNumber_ClientTrade_UsesNumericSequenceAndSanitizesUnderlyingCode() + public void BuildTradeNumber_AgencyTrade_UsesNumericSequenceAndSanitizesUnderlyingCode() { var trade = CreateSwapTrade(); - trade.OpponentRole = "甲方"; + trade.OpponentRole = "乙方"; trade.TradeDate = new DateTime(2026, 7, 24); trade.UnderlyingCode = "250210.IB"; - var number = GuolianContractNoGenerator.BuildTradeNumber(trade, "IS", 3); + var number = GuolianContractNoGenerator.BuildTradeNumber(trade, "IS", AssetUnit.BookCategoryAgency, 3); Assert.AreEqual("GLMS-IS-20260724-FICC-03-250210IB", number); } @@ -63,18 +63,113 @@ namespace YLErp.UnitTestProject.Modules.TradeModule.DocGenerateModule [DataRow(1, "A")] [DataRow(26, "Z")] [DataRow(27, "AA")] - public void BuildTradeNumber_NonClientTrade_UsesLetterSequence(int sequenceNo, string sequenceCode) + public void BuildTradeNumber_SecuritiesLendingTrade_UsesLetterSequence(int sequenceNo, string sequenceCode) { var trade = CreateSwapTrade(); - trade.OpponentRole = "乙方"; + trade.OpponentRole = "甲方"; trade.TradeDate = new DateTime(2026, 7, 24); trade.UnderlyingCode = "180205.IB"; - var number = GuolianContractNoGenerator.BuildTradeNumber(trade, "glmscounter", sequenceNo); + var number = GuolianContractNoGenerator.BuildTradeNumber(trade, "glmscounter", AssetUnit.BookCategorySecuritiesLending, sequenceNo); Assert.AreEqual($"GLMS-glmscounter-20260724-FICC-{sequenceCode}-180205IB", number); } + [TestMethod] + public void GetNextSequenceNo_AgencyTrade_UsesMaximumNumericSequence() + { + var tradeNumbers = new[] + { + "GLMS-1TT-20260804-FICC-01-180205IB", + "GLMS-1TT-20260804-FICC-02-180205IB", + "GLMS-1TT-20260804-FICC-03-180205IB", + "GLMS-1TT-20260804-FICC-A-180205IB", + "GLMS-1TT-20260804-FICC-CUSTOM-180205IB" + }; + + var sequenceNo = GuolianContractNoGenerator.GetNextSequenceNo( + tradeNumbers, + "1TT", + new DateTime(2026, 8, 4), + AssetUnit.BookCategoryAgency); + + Assert.AreEqual(4, sequenceNo); + } + + [TestMethod] + public void GetNextSequenceNo_AgencyTrade_StandardManualNumberReservesSequence() + { + var tradeNumbers = new[] + { + "GLMS-1TT-20260804-FICC-01-180205IB", + "GLMS-1TT-20260804-FICC-02-180205IB", + "GLMS-1TT-20260804-FICC-99-180205IB" + }; + + var sequenceNo = GuolianContractNoGenerator.GetNextSequenceNo( + tradeNumbers, + "1tt", + new DateTime(2026, 8, 4), + AssetUnit.BookCategoryAgency); + + Assert.AreEqual(100, sequenceNo); + } + + [TestMethod] + public void GetNextSequenceNo_SecuritiesLendingTrade_ExtendsLetterSequence() + { + var tradeNumbers = new[] + { + "GLMS-1TT-20260804-FICC-Z-180205IB", + "GLMS-1TT-20260804-FICC-AA-180205IB", + "GLMS-1TT-20260804-FICC-ZZ-180205IB", + "GLMS-1TT-20260804-FICC-99-180205IB" + }; + + var sequenceNo = GuolianContractNoGenerator.GetNextSequenceNo( + tradeNumbers, + "1TT", + new DateTime(2026, 8, 4), + AssetUnit.BookCategorySecuritiesLending); + var trade = CreateSwapTrade(); + trade.TradeDate = new DateTime(2026, 8, 4); + trade.UnderlyingCode = "180205.IB"; + + var number = GuolianContractNoGenerator.BuildTradeNumber( + trade, + "1TT", + AssetUnit.BookCategorySecuritiesLending, + sequenceNo); + + Assert.AreEqual("GLMS-1TT-20260804-FICC-AAA-180205IB", number); + } + + [TestMethod] + public void GetNextSequenceNo_SeparatesNumericAndLetterSequences() + { + var tradeNumbers = new[] + { + "GLMS-1TT-20260804-FICC-01-180205IB", + "GLMS-1TT-20260804-FICC-02-180205IB", + "GLMS-1TT-20260804-FICC-A-180205IB", + "GLMS-1TT-20260804-FICC-B-180205IB" + }; + + var agencySequenceNo = GuolianContractNoGenerator.GetNextSequenceNo( + tradeNumbers, + "1TT", + new DateTime(2026, 8, 4), + AssetUnit.BookCategoryAgency); + var securitiesLendingSequenceNo = GuolianContractNoGenerator.GetNextSequenceNo( + tradeNumbers, + "1TT", + new DateTime(2026, 8, 4), + AssetUnit.BookCategorySecuritiesLending); + + Assert.AreEqual(3, agencySequenceNo); + Assert.AreEqual(3, securitiesLendingSequenceNo); + } + private static trade CreateSwapTrade() { return new trade { TradeType = "收益互换" }; diff --git a/YLErpDAL/Modules/BasicDataModule/AssetUnitDataService.cs b/YLErpDAL/Modules/BasicDataModule/AssetUnitDataService.cs index af2d33df..1f5f2f17 100644 --- a/YLErpDAL/Modules/BasicDataModule/AssetUnitDataService.cs +++ b/YLErpDAL/Modules/BasicDataModule/AssetUnitDataService.cs @@ -35,6 +35,26 @@ namespace YLErp.Modules.BasicDataModule return DataCacheManager.GetAssetUnitDataSource().AsQueryable().FirstOrDefault(n => n.id == id); } + public int GetBookCategoryReferencedTradeCount(AssetUnit req) + { + if (req == null || req.id == 0) + { + return 0; + } + + var currentBookCategory = DbContext.assetunit + .Where(x => x.id == req.id) + .Select(x => x.BookCategory) + .FirstOrDefault(); + + if (currentBookCategory == req.BookCategory) + { + return 0; + } + + return DbContext.trade.Count(x => x.AssetId == req.id); + } + public AssetUnit SaveAssetUnit(AssetUnit req) { if (req is null) @@ -47,6 +67,12 @@ namespace YLErp.Modules.BasicDataModule throw new ServiceException("簿记账户名称 必须填写"); } + if (req.BookCategory != AssetUnit.BookCategoryAgency && + req.BookCategory != AssetUnit.BookCategorySecuritiesLending) + { + throw new ServiceException("簿记分类 必须填写"); + } + AssetUnit dbModel; if (DbContext.assetunit.Any(x => x.id != req.id && x.Name == req.Name)) @@ -137,6 +163,7 @@ namespace YLErp.Modules.BasicDataModule id = a.id, GroupId = a.GroupId, BaseCurrency = a.BaseCurrency, + BookCategory = a.BookCategory, InitialMoney = a.InitialMoney, Name = a.Name, OptDate = a.OptDate, @@ -320,6 +347,7 @@ namespace YLErp.Modules.BasicDataModule id = a.id, GroupId = a.GroupId, BaseCurrency = a.BaseCurrency, + BookCategory = a.BookCategory, InitialMoney = a.InitialMoney, Name = a.Name, OptDate = a.OptDate, diff --git a/YLErpDAL/Modules/ExchangeTradeModule/ExchangeTradeSaveService.cs b/YLErpDAL/Modules/ExchangeTradeModule/ExchangeTradeSaveService.cs index 0a6f41e8..bdaebced 100644 --- a/YLErpDAL/Modules/ExchangeTradeModule/ExchangeTradeSaveService.cs +++ b/YLErpDAL/Modules/ExchangeTradeModule/ExchangeTradeSaveService.cs @@ -121,7 +121,7 @@ namespace YLErp.Modules.ExchangeTradeModule } var assetUnit = DbContext.assetunit.Where(n => n.id == req.AssetBookId) - .Select(n => new AssetUnitDto { id = n.id, Name = n.Name, TraderIds = n.TraderIds, UserGroup = n.UserGroup }).FirstOrDefault(); + .Select(n => new AssetUnitDto { id = n.id, Name = n.Name, BookCategory = n.BookCategory, TraderIds = n.TraderIds, UserGroup = n.UserGroup }).FirstOrDefault(); if (assetUnit == null) { diff --git a/YLErpDAL/Modules/SwapModule/SwapTradeService.cs b/YLErpDAL/Modules/SwapModule/SwapTradeService.cs index caae51b4..3d308d0e 100644 --- a/YLErpDAL/Modules/SwapModule/SwapTradeService.cs +++ b/YLErpDAL/Modules/SwapModule/SwapTradeService.cs @@ -901,7 +901,7 @@ namespace YLErp.Modules.SwapModule } var _assetUnit = DbContext.assetunit.Where(n => n.id == req.AssetId) - .Select(n => new AssetUnitDto { id = n.id, Name = n.Name, TraderIds = n.TraderIds, UserGroup = n.UserGroup }).FirstOrDefault(); + .Select(n => new AssetUnitDto { id = n.id, Name = n.Name, BookCategory = n.BookCategory, TraderIds = n.TraderIds, UserGroup = n.UserGroup }).FirstOrDefault(); if (_assetUnit == null) { throw new ServiceException("簿记账户不存在"); diff --git a/YLErpDAL/Modules/TradeModule/DocGenerateModule/GuolianContractNoGenerator.cs b/YLErpDAL/Modules/TradeModule/DocGenerateModule/GuolianContractNoGenerator.cs index 6a26328a..8ea7fd93 100644 --- a/YLErpDAL/Modules/TradeModule/DocGenerateModule/GuolianContractNoGenerator.cs +++ b/YLErpDAL/Modules/TradeModule/DocGenerateModule/GuolianContractNoGenerator.cs @@ -7,11 +7,11 @@ using YLErp.DBModels.Enums; namespace YLErp.Modules.TradeModule.DocGenerateModule { /// - /// 国贸交易确认书编号生成器 + /// 国联交易确认书编号生成器 /// 规则: - /// - 对客交易(OpponentRole为"甲方"):GLMS-{对手方代码}-{成交日期(yyyyMMdd)}-FICC-{当日第N笔对客交易(数字递增)}-{标的代码},从01开始 + /// - 代客交易(簿记分类为"代客"):GLMS-{对手方代码}-{成交日期(yyyyMMdd)}-FICC-{当日第N笔代客交易(数字递增)}-{标的代码},从01开始 /// 例:GLMS-IS-20260424-01-250210IB - /// - 非对客交易(OpponentRole为"乙方"):GLMS-{对手方代码}-{成交日期(yyyyMMdd)}-FICC-{当日第N笔非对客交易使用字母递增}-{标的代码},从A开始 + /// - 融券交易(簿记分类为"融券"):GLMS-{对手方代码}-{成交日期(yyyyMMdd)}-FICC-{当日第N笔融券交易使用字母递增}-{标的代码},从A开始 /// 例:GLMS-IS-20260424-A-250210IB /// public class GuolianContractNoGenerator @@ -78,18 +78,69 @@ namespace YLErp.Modules.TradeModule.DocGenerateModule /// /// 按国联确认书编号规则拼装编号(纯函数,不依赖数据库,便于单测)。 /// 格式:GLMS-{clientCode}-{成交日期(yyyyMMdd)}-FICC-{序号}-{标的代码(去点)} - /// - 对客交易(甲方):序号用两位数字,从 01 开始 - /// - 非对客交易(乙方):序号用字母递增,从 A 开始 + /// - 代客交易:序号用两位数字,从 01 开始 + /// - 融券交易:序号用字母递增,从 A 开始 /// - public static string BuildTradeNumber(trade trade, string clientCode, int sequenceNo) + public static string BuildTradeNumber(trade trade, string clientCode, string bookCategory, int sequenceNo) { - var isClientTrade = trade.OpponentRole == "甲方"; + var isAgencyTrade = bookCategory == AssetUnit.BookCategoryAgency; var underlyingCode = (trade.UnderlyingCode ?? "").Replace(".", ""); // 去掉标的代码中的点号 var tradeDateStr = (trade.TradeDate ?? DateTime.MinValue).ToString("yyyyMMdd"); - var seq = isClientTrade ? sequenceNo.ToString("D2") : NumberToLetter(sequenceNo); + var seq = isAgencyTrade ? sequenceNo.ToString("D2") : NumberToLetter(sequenceNo); return $"GLMS-{clientCode}-{tradeDateStr}-FICC-{seq}-{underlyingCode}"; } + public static int GetNextSequenceNo( + IEnumerable tradeNumbers, + string clientCode, + DateTime tradeDate, + string bookCategory) + { + if (bookCategory != AssetUnit.BookCategoryAgency && + bookCategory != AssetUnit.BookCategorySecuritiesLending) + { + throw new ArgumentException("簿记分类无效", nameof(bookCategory)); + } + + var prefix = $"GLMS-{clientCode}-{tradeDate:yyyyMMdd}-FICC-"; + var isAgencyTrade = bookCategory == AssetUnit.BookCategoryAgency; + var maxSequenceNo = 0; + + foreach (var tradeNumber in tradeNumbers ?? Enumerable.Empty()) + { + if (string.IsNullOrWhiteSpace(tradeNumber) || + !tradeNumber.StartsWith(prefix, StringComparison.OrdinalIgnoreCase)) + { + continue; + } + + var sequenceEndIndex = tradeNumber.IndexOf('-', prefix.Length); + if (sequenceEndIndex <= prefix.Length) + { + continue; + } + + var sequenceText = tradeNumber.Substring( + prefix.Length, + sequenceEndIndex - prefix.Length); + var sequenceNo = isAgencyTrade + ? ParseNumericSequence(sequenceText) + : LetterToNumber(sequenceText); + + if (sequenceNo.HasValue && sequenceNo.Value > maxSequenceNo) + { + maxSequenceNo = sequenceNo.Value; + } + } + + if (maxSequenceNo == int.MaxValue) + { + throw new InvalidOperationException("国联收益互换交易编号序号已超出支持范围"); + } + + return maxSequenceNo + 1; + } + /// /// 生成国贸交易确认书编号 /// @@ -103,6 +154,16 @@ namespace YLErp.Modules.TradeModule.DocGenerateModule string clientCode) { var tradeDate = trade.TradeDate ?? DateTime.MinValue; + var bookCategory = dbContext.assetunit + .Where(a => a.id == trade.AssetId) + .Select(a => a.BookCategory) + .FirstOrDefault(); + + if (bookCategory != AssetUnit.BookCategoryAgency && + bookCategory != AssetUnit.BookCategorySecuritiesLending) + { + throw new ServiceException("簿记账户未维护有效的簿记分类"); + } lock (_syncLock) { @@ -117,20 +178,77 @@ namespace YLErp.Modules.TradeModule.DocGenerateModule return existingForTrade; } - // 通过当天同客户同类交易的 id 排序确定序号(幂等),每个客户独立递增 + // 编号中的数字/字母序列记录生成时的分类,不受簿记账户后续分类调整影响。 var tradeDateStart = tradeDate.Date; - var sameDayTradesCount = dbContext.trade - .Count(t => t.TradeDate >= tradeDateStart + var sameDayTradeNumbers = dbContext.trade + .Where(t => t.TradeDate >= tradeDateStart && t.TradeDate < tradeDateStart.AddDays(1) && t.ClientId == trade.ClientId - && t.OpponentRole == trade.OpponentRole - && t.id < trade.id); - var sequenceNo = sameDayTradesCount + 1; + && t.id != trade.id + && t.TradeNumber != null + && t.TradeNumber != "") + .Select(t => t.TradeNumber) + .ToArray(); + var sequenceNo = GetNextSequenceNo( + sameDayTradeNumbers, + clientCode, + tradeDate, + bookCategory); - return BuildTradeNumber(trade, clientCode, sequenceNo); + while (true) + { + var candidate = BuildTradeNumber(trade, clientCode, bookCategory, sequenceNo); + var isExists = dbContext.trade.Any(t => t.id != trade.id && t.TradeNumber == candidate); + if (!isExists) + { + return candidate; + } + + if (sequenceNo == int.MaxValue) + { + throw new InvalidOperationException("国联收益互换交易编号序号已超出支持范围"); + } + + sequenceNo++; + } } } + private static int? ParseNumericSequence(string sequence) + { + return sequence.All(char.IsDigit) && int.TryParse(sequence, out var number) && number > 0 + ? number + : null; + } + + private static int? LetterToNumber(string sequence) + { + if (string.IsNullOrWhiteSpace(sequence)) + { + return null; + } + + var number = 0; + foreach (var value in sequence) + { + var letter = char.ToUpperInvariant(value); + if (letter < 'A' || letter > 'Z') + { + return null; + } + + var letterValue = letter - 'A' + 1; + if (number > (int.MaxValue - letterValue) / 26) + { + return null; + } + + number = number * 26 + letterValue; + } + + return number; + } + /// /// 将数字转换为字母序列(1=A, 2=B, 26=Z, 27=AA, 28=AB...) /// diff --git a/YLErpDAL/Modules/TradeModule/OrderModule/TradeSavePreHandler.cs b/YLErpDAL/Modules/TradeModule/OrderModule/TradeSavePreHandler.cs index 699a1dd4..ac9c2f96 100644 --- a/YLErpDAL/Modules/TradeModule/OrderModule/TradeSavePreHandler.cs +++ b/YLErpDAL/Modules/TradeModule/OrderModule/TradeSavePreHandler.cs @@ -450,7 +450,7 @@ namespace YLErp.Modules.TradeModule.OrderModule if (_assetUnit == null) { _assetUnit = DbContext.assetunit.Where(n => n.id == req.AssetId) - .Select(n => new AssetUnitDto { id = n.id, Name = n.Name, TraderIds = n.TraderIds, UserGroup = n.UserGroup }).FirstOrDefault(); + .Select(n => new AssetUnitDto { id = n.id, Name = n.Name, BookCategory = n.BookCategory, TraderIds = n.TraderIds, UserGroup = n.UserGroup }).FirstOrDefault(); if (_assetUnit == null) { throw new ServiceException("簿记账户不存在"); @@ -1576,4 +1576,4 @@ namespace YLErp.Modules.TradeModule.OrderModule } } } -} \ No newline at end of file +} diff --git a/YLErpWeb/Controllers/assetunitController.cs b/YLErpWeb/Controllers/assetunitController.cs index 6b210dc1..e88c21ae 100644 --- a/YLErpWeb/Controllers/assetunitController.cs +++ b/YLErpWeb/Controllers/assetunitController.cs @@ -96,7 +96,7 @@ namespace YLErp.Web.Controllers var isAdd = string.IsNullOrEmpty(enid) || enid == "0"; if (isAdd) { - return View(new AssetUnit()); + return View(new AssetUnit { BookCategory = AssetUnit.BookCategoryAgency }); } var intid = DecryptInt(enid); var r = yldb.assetunit.Find(intid); @@ -104,14 +104,25 @@ namespace YLErp.Web.Controllers } [HttpPost] - public JsonResult AssetunitEditJson(AssetUnit req) + public JsonResult AssetunitEditJson(AssetUnit req, bool confirmBookCategoryChange = false) { if (!string.IsNullOrEmpty(req.EncryptId)) { req.id = DecryptInt(req.EncryptId); } - var r = new AssetUnitDataService(CurUser).SaveAssetUnit(req); + var service = new AssetUnitDataService(CurUser); + var referencedTradeCount = service.GetBookCategoryReferencedTradeCount(req); + if (!confirmBookCategoryChange && referencedTradeCount > 0) + { + return JsonSuccess(data: new + { + NeedBookCategoryChangeConfirm = true, + Message = $"该簿记账户已被 {referencedTradeCount} 笔交易引用,修改簿记分类可能导致历史编号口径不一致,确认继续?" + }); + } + + var r = service.SaveAssetUnit(req); return JsonSuccess("更新成功", r); } diff --git a/YLErpWeb/Views/assetunit/assetunitEdit.cshtml b/YLErpWeb/Views/assetunit/assetunitEdit.cshtml index 80dfb3d3..129e2098 100644 --- a/YLErpWeb/Views/assetunit/assetunitEdit.cshtml +++ b/YLErpWeb/Views/assetunit/assetunitEdit.cshtml @@ -27,6 +27,14 @@ @Html.HiddenFor(model => model.EncryptId) @Html.MyTextFor(model => model.Name, true) +
+ + + +
@if (ConsUserGroup.HasGroup) {
@@ -110,4 +118,4 @@
-} \ No newline at end of file +} diff --git a/YLErpWeb/Views/assetunit/assetunitList.cshtml b/YLErpWeb/Views/assetunit/assetunitList.cshtml index 05430ec5..add22322 100644 --- a/YLErpWeb/Views/assetunit/assetunitList.cshtml +++ b/YLErpWeb/Views/assetunit/assetunitList.cshtml @@ -39,6 +39,7 @@ }, { name: 'id', label: 'id', index: 'id', width: 1, hidden: true }, { name: 'EncryptId', label: 'EncryptId', index: 'EncryptId', width: 0, hidden: true }, { name: 'Name', label: '簿记账户名称', index: 'Name', width: 150 + }, { name: 'BookCategory', label: '簿记分类', index: 'BookCategory', width: 90 }, { name: 'UserGroup', label: "用户组", width: 150, hidden: !page.HasGroup, optionHide: !page.HasGroup }, { name: 'GroupName', label: "账户组名称", index: 'GroupId', width: 150 }, { name: 'BaseCurrency', label: '基础币种', index: 'BaseCurrency', width: 90 diff --git a/YLErpWeb/Views/assetunit/assetunitView.cshtml b/YLErpWeb/Views/assetunit/assetunitView.cshtml index 20dac878..712e8946 100644 --- a/YLErpWeb/Views/assetunit/assetunitView.cshtml +++ b/YLErpWeb/Views/assetunit/assetunitView.cshtml @@ -28,6 +28,10 @@ 簿记账户名称 @Model.Name + + 簿记分类 + @Model.BookCategory + @if (ConsUserGroup.HasGroup) { @@ -74,4 +78,4 @@ } @MyControls.Btn("关闭", "layer.closeMe();") -@Html.HiddenFor(model => model.id) \ No newline at end of file +@Html.HiddenFor(model => model.id) diff --git a/YLErpWeb/wwwroot/Scripts/app/basic/assetunitEdit.js b/YLErpWeb/wwwroot/Scripts/app/basic/assetunitEdit.js index 6da9b042..7c360dde 100644 --- a/YLErpWeb/wwwroot/Scripts/app/basic/assetunitEdit.js +++ b/YLErpWeb/wwwroot/Scripts/app/basic/assetunitEdit.js @@ -45,7 +45,7 @@ function checkSubmitData() { return pass; } -function saveassetunit() { +function saveassetunit(confirmBookCategoryChange) { var iniMomeyObj = $("#InitialMoney"); iniMomeyObj.val(numeral(iniMomeyObj.val()).value()); if (!checkSubmitData()) return false; @@ -54,6 +54,7 @@ function saveassetunit() { if (Array.isArray(data.TraderIds)) { data.TraderIds = data.TraderIds.join(','); } + data.confirmBookCategoryChange = confirmBookCategoryChange === true; var ajaxopt = { type: "Post", url: "/assetunit/assetunitEditJson", @@ -61,6 +62,12 @@ function saveassetunit() { dataType: "json", success: function (data) { if (data.success) { + if (data.obj && data.obj.NeedBookCategoryChangeConfirm) { + main.confirm(data.obj.Message, function () { + saveassetunit(true); + }); + return; + } window.parent.showmiddlemessage("成功更新本条数据"); try { window.parent.reloadassetunit(); } catch (e) { } window.location.href = "/assetunit/assetunitview?enid=" + data.obj.EncryptId; @@ -138,4 +145,4 @@ var vueDetails = new Vue({ main.ajax(ajaxopt); } } -}); \ No newline at end of file +});