#EQD-6605 国联民生-确认书编号规则调整(不基于甲方乙方判定)
feat: 国联民生收益互换按簿记分类生成交易编号 簿记账户新增“簿记分类”字段,支持代客、融券,新增账户默认代客,历史账户统一初始化为代客 簿记账户分类设为必填,列表、编辑及详情页面同步展示 修改已被交易引用的簿记账户分类时增加二次确认,并提示关联交易数量 国联民生收益互换交易编号不再根据甲乙方判断,改为根据簿记账户分类生成 代客使用数字序号,融券使用字母序号,分别从已有同客户同日编号的最大序号继续递增 保留手工交易编号优先逻辑,标准格式的手工编号参与后续最大序号计算 生成候选编号后检查完整交易编号是否已存在,存在则继续递增 新增簿记分类编号格式、最大序号计算及数字字母序列隔离专项单测
This commit is contained in:
@@ -9,6 +9,9 @@ namespace YLErp.DBModels
|
||||
[Table("assetunit")]
|
||||
public class AssetUnit : DBModelWithOperator, IDataEntity, IDataTraceV2, IClonable<AssetUnit>
|
||||
{
|
||||
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; }
|
||||
|
||||
/// <summary>
|
||||
/// 基础币种
|
||||
/// </summary>
|
||||
|
||||
+101
-6
@@ -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 = "收益互换" };
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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("簿记账户不存在");
|
||||
|
||||
@@ -7,11 +7,11 @@ using YLErp.DBModels.Enums;
|
||||
namespace YLErp.Modules.TradeModule.DocGenerateModule
|
||||
{
|
||||
/// <summary>
|
||||
/// 国贸交易确认书编号生成器
|
||||
/// 国联交易确认书编号生成器
|
||||
/// 规则:
|
||||
/// - 对客交易(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
|
||||
/// </summary>
|
||||
public class GuolianContractNoGenerator
|
||||
@@ -78,18 +78,69 @@ namespace YLErp.Modules.TradeModule.DocGenerateModule
|
||||
/// <summary>
|
||||
/// 按国联确认书编号规则拼装编号(纯函数,不依赖数据库,便于单测)。
|
||||
/// 格式:GLMS-{clientCode}-{成交日期(yyyyMMdd)}-FICC-{序号}-{标的代码(去点)}
|
||||
/// - 对客交易(甲方):序号用两位数字,从 01 开始
|
||||
/// - 非对客交易(乙方):序号用字母递增,从 A 开始
|
||||
/// - 代客交易:序号用两位数字,从 01 开始
|
||||
/// - 融券交易:序号用字母递增,从 A 开始
|
||||
/// </summary>
|
||||
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<string> 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<string>())
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 生成国贸交易确认书编号
|
||||
/// </summary>
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 将数字转换为字母序列(1=A, 2=B, 26=Z, 27=AA, 28=AB...)
|
||||
/// </summary>
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -27,6 +27,14 @@
|
||||
<input type="hidden" value="@Model.id" name="id" id="id" />
|
||||
@Html.HiddenFor(model => model.EncryptId)
|
||||
@Html.MyTextFor(model => model.Name, true)
|
||||
<div class="form-group">
|
||||
<label class="formlabel" for="BookCategory">簿记分类</label>
|
||||
<select id="BookCategory" name="BookCategory" class="text-box" data-val="true" data-val-required="簿记分类 必须填写">
|
||||
<option value="@AssetUnit.BookCategoryAgency" @(Model.BookCategory == AssetUnit.BookCategoryAgency ? "selected" : "")>代客</option>
|
||||
<option value="@AssetUnit.BookCategorySecuritiesLending" @(Model.BookCategory == AssetUnit.BookCategorySecuritiesLending ? "selected" : "")>融券</option>
|
||||
</select>
|
||||
<span class="field-validation-valid" data-valmsg-for="BookCategory" data-valmsg-replace="true"></span>
|
||||
</div>
|
||||
@if (ConsUserGroup.HasGroup)
|
||||
{
|
||||
<div class="form-group">
|
||||
@@ -110,4 +118,4 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -28,6 +28,10 @@
|
||||
<th class="tdRight">簿记账户名称</th>
|
||||
<td colspan="3">@Model.Name</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th class="tdRight">簿记分类</th>
|
||||
<td colspan="3">@Model.BookCategory</td>
|
||||
</tr>
|
||||
@if (ConsUserGroup.HasGroup)
|
||||
{
|
||||
<tr>
|
||||
@@ -74,4 +78,4 @@
|
||||
}
|
||||
@MyControls.Btn("关闭", "layer.closeMe();")
|
||||
</div>
|
||||
@Html.HiddenFor(model => model.id)
|
||||
@Html.HiddenFor(model => model.id)
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user