chore(swap): 删除确认书/结算报告厂商定制死分支——国联专属分支Company恒定,24个厂商确认书编号生成器+批量开关收敛国联直调(瑞达/海通/格林大华批量方法连带),结算报告模板与HasExtendVol同款收敛;保留WCZD公开方法(插件接口ITradeDocGeneratorContext成员,防外部DLL ABI);顺手修正GenerateGuolianContractNo存量错注释(国贸→国联)。-1214行,Release/Debug/UnitTestProject构建0错误

This commit is contained in:
hjhan
2026-08-22 08:11:43 +08:00
parent 7b65ec0979
commit 7ac219ad0f
4 changed files with 8 additions and 1222 deletions
@@ -1214,142 +1214,12 @@ namespace YLErp.Modules.TradeModule.DocGenerateModule
liststr.ForEach(o => ContractCodeCache.Remove(o));
#endregion
switch (GetErpConfig().Company)
{
case CompanyEnum.:
contractNo = GenerateCJContractNo();
break;
case CompanyEnum.:
contractNo = GenerateHYContractNo();
break;
case CompanyEnum.:
contractNo = GenerateHTContractNo();
break;
case CompanyEnum.:
contractNo = GenerateZCContractNo(out contractIndex);
break;
case CompanyEnum.:
contractNo = GenerateGTJAContractNo(out contractIndex);
break;
case CompanyEnum.:
contractNo = GenerateSQContractNo(out contractIndex);
break;
case CompanyEnum.:
contractNo = GenerateRDXKContractNo();
break;
case CompanyEnum.:
contractNo = GenerateDFCFContractNo(out contractIndex);
break;
case CompanyEnum.:
contractNo = GenerateGHContractNo(out contractIndex);
break;
case CompanyEnum.西:
contractNo = GenerateSXContractNo(out contractIndex);
break;
case CompanyEnum.:
contractNo = GenerateDongGuanContractNo(out contractIndex);
break;
case CompanyEnum.:
contractNo = GenerateTFContractNo(out contractIndex);
break;
case CompanyEnum.广:
contractNo = GenerateGQContractNo(out contractIndex);
break;
case CompanyEnum.:
contractNo = GenerateGTJAContractNo(out contractIndex);
break;
case CompanyEnum.:
contractNo = GenerateZheQiContractNo(out contractIndex);
break;
case CompanyEnum.:
contractNo = GenerateGXJYContractNo(out contractIndex);
break;
case CompanyEnum.:
contractNo = GenerateHuaAniContractNo();
break;
case CompanyEnum.西:
contractNo = GenerateHuaXiContractNo();
break;
case CompanyEnum.:
contractNo = GenerateGuoMaoContractNo();
break;
case CompanyEnum.:
contractNo = GenerateWCZDContractNo();
break;
case CompanyEnum.:
contractNo = GenerateZhaoZhengContractNo();
break;
case CompanyEnum.:
case CompanyEnum.:
contractNo = "yilian-" + UniqueTimeId.GetStr();
break;
case CompanyEnum.西:
contractNo = GenerateShanXiGuShouContractNo();
break;
case CompanyEnum.:
contractNo = GenerateZheShangContractNo();
break;
case CompanyEnum.:
contractNo = GenerateGuolianContractNo();
break;
default:
throw new ContextMarshalException("未实现");
}
contractNo = GenerateGuolianContractNo();
return contractNo;
}
/// <summary>
/// 山西固收交易确认书编号
/// </summary>
/// <returns></returns>
private string GenerateShanXiGuShouContractNo()
{
if (_contractType != ContractTypeEnum.Trade)
{
return UniqueTimeId.GetStr();
}
return Trade.TradeNumber;
string prefix = $"SAC-{Trade.TradeDate:yyyyMMdd}-GSTRS-";
string contractNo = string.Empty;
lock (_syncLock)
{
var query = from r in DbContext.trade_contract_r
join t in DbContext.trade on r.TradeId equals t.id
where r.Type == ContractTypeEnum.Trade && r.ContractCode.StartsWith(prefix)
select r;
var codeList = query.Select(s => s.ContractCode).ToList();
var count = codeList.Count;
do
{
count++;
contractNo = $"{prefix}{count:0000}";
} while (codeList.Contains(contractNo));
}
return contractNo;
}
/// <summary>
/// 浙商交易确认书编号
/// </summary>
/// <returns></returns>
private string GenerateZheShangContractNo()
{
if (_contractType != ContractTypeEnum.Trade)
{
return UniqueTimeId.GetStr();
}
if (Trade.TradeType == "收益互换")
{
var posi = GetSwapPositions(Trade.id, true).FirstOrDefault(p => p.PositionType > 0);
var isLong = posi?.PositionType == (int)PositionTypeFlag.Short ? false : true;
return "GLMS-" + _client.Number + "-" + Trade.TradeDate?.ToString("yyyyMMdd") + (isLong ? "-L" : "-S");
}
return Trade.TradeNumber;
}
/// <summary>
/// 生成国贸确认书编号
/// 生成国联确认书编号
/// </summary>
private string GenerateGuolianContractNo()
{
@@ -1360,429 +1230,6 @@ namespace YLErp.Modules.TradeModule.DocGenerateModule
return Trade.TradeNumber;
}
/// <summary>
/// 生成国贸确认书编号
/// </summary>
/// <returns></returns>
/// <exception cref="NotImplementedException"></exception>
private string GenerateGuoMaoContractNo()
{
var contractNo = "";
var sb = new StringBuilder($"{GetClient().Number}");
var builder = PredicateBuilder.Create<trade_contract_r>(O => true);
switch (_contractType)
{
case ContractTypeEnum.Trade:
sb.Append("-JY-");
sb.Append(Trade.TradeDate.Value.ToString("yyyyMMdd"));
builder = builder.And(O => O.Type == ContractTypeEnum.Trade);
break;
case ContractTypeEnum.UnWind:
case ContractTypeEnum.Clearing:
default:
builder = builder.And(O => O.Type != ContractTypeEnum.Trade);
sb.Append("-JS-");
sb.Append(GetTradeCash().ValueDate.ToString("yyyyMMdd"));
break;
}
var prefix = sb.ToString();
var codeList = DbContext.trade_contract_r.AsNoTracking().Where(builder).Where(O => O.ContractCode.StartsWith(prefix)).Select(O => O.ContractCode).ToList();
var count = codeList.Count;
do
{
count++;
contractNo = $"{prefix}{count:000}";
} while (codeList.Contains(contractNo));
return contractNo;
}
/// <summary>
/// 生成招证确认书编号
/// </summary>
/// <returns></returns>
/// <exception cref="NotImplementedException"></exception>
private string GenerateZhaoZhengContractNo()
{
var service = new TradeMetaService(OptUser);
var tc = GetTradeCash();
var contractNo = "";
var suffix = "";
var sb = new StringBuilder($"SAC-{GetClient().Number}-");
var builder = PredicateBuilder.Create<trade_contract_r>(O => true);
switch (_contractType)
{
case ContractTypeEnum.Trade:
sb.Append(Trade.TradeDate.Value.ToString("yyyyMMdd"));
builder = builder.And(O => O.Type == ContractTypeEnum.Trade);
break;
case ContractTypeEnum.UnWind:
case ContractTypeEnum.Clearing:
default:
builder = builder.And(O => O.Type != ContractTypeEnum.Trade);
sb.Append(tc.ValueDate.ToString("yyyyMMdd"));
suffix = "QS";
break;
}
switch (Trade.TradeType)
{
case "收益互换":
sb.Append("SW");
break;
case "远期":
sb.Append("FW");
break;
case "现金流交易":
sb.Append("OT");
break;
default:
sb.Append("OP");
break;
}
var prefix = sb.ToString();
var codeList = DbContext.trade_contract_r.AsNoTracking().Where(builder).Where(O => O.ContractCode.StartsWith(prefix)).Select(O => O.ContractCode).ToList();
var count = codeList.Count;
do
{
count++;
contractNo = $"{prefix}{count:00}{suffix}";
} while (codeList.Contains(contractNo));
//var metaKey = "期货报送成交编号" + tc.id;
//if (service.GetTradeMeta(Trade.id, metaKey).IsNullOrWhiteSpace())
//{
// var dealNumber = GenerateZhaoZhengDealNumber(prefix);
// new TradeMetaService(OptUser).AddTradeMeta(Trade.id, metaKey, dealNumber);
//}
return contractNo;
}
/// <summary>
/// 生成招证期货报送成交编号
/// </summary>
/// <returns></returns>
/// <exception cref="NotImplementedException"></exception>
//private string GenerateZhaoZhengDealNumber(string contractNoPrefix)
//{
// var contractNo = "";
// string tradeType = "";
// switch (Trade.TradeType)
// {
// case "收益互换":
// tradeType = "SW";
// break;
// case "远期":
// tradeType = "FW";
// break;
// case "现金流交易":
// tradeType = "OT";
// break;
// default:
// tradeType = "OP";
// break;
// }
// StringBuilder tradeNumberStr = new StringBuilder($"{tradeType}-{GetClient().Number}-");
// switch (_contractType)
// {
// case ContractTypeEnum.Trade:
// tradeNumberStr.Append(Trade.TradeDate.Value.ToString("yyyyMMdd"));
// break;
// case ContractTypeEnum.UnWind:
// case ContractTypeEnum.Clearing:
// default:
// tradeNumberStr.Append(GetTradeCash().ValueDate.ToString("yyyyMMdd"));
// break;
// }
// string prefix = tradeNumberStr.ToString();
// var list = DbContext.TradeMeta.Where(O => O.MetaKey.StartsWith("期货报送成交编号") && O.MetaValue.StartsWith(prefix)).Select(O => O.MetaValue).ToArray();
// var count = DbContext.trade_contract_r.AsNoTracking().Where(O => O.ContractCode.StartsWith(contractNoPrefix)).Count();
// do
// {
// count++;
// contractNo = $"{prefix}{count:0000}";
// } while (list.Contains(contractNo));
// return contractNo;
//}
/// <summary>
/// 仅支持生成提前终止和到期结算确认书编号
/// </summary>
/// <param name="contractIndex"></param>
/// <returns></returns>
private string GenerateHuaXiContractNo()
{
var contractNo = "";
const string company = "华西证券-";
var year = Trade.TradeDate?.ToString("yyyy") + "-";
var leftPart = "SACOE-" + company + year;
if (Trade.TradeType == "收益互换")
{
leftPart = "SACTE-" + company + year;
}
var rule = Trade.TradeNumber.Split('-')?[3];
var prefix = leftPart + rule;
var contractCode = DbContext.trade_contract_r.Where(O => O.ContractCode.StartsWith(prefix) && O.IsValid).OrderByDescending(x => x.ContractCode)?.FirstOrDefault()?.ContractCode;
var code = contractCode == null ? "0" : contractCode.Substring(contractCode.Length - 1, 1);
var count = Convert.ToInt32(code) + 1;
contractNo = $"{prefix}-{count}";
return contractNo;
}
/// <summary>
/// 仅支持生成提前终止和到期结算确认书编号
/// </summary>
/// <param name="contractIndex"></param>
/// <returns></returns>
private string GenerateHuaAniContractNo()
{
var client = GetClient();
var prefix = Trade.TradeNumber + "-JS";
var contractNo = "";
var contractCode = DbContext.trade_contract_r.Where(O => O.ContractCode.StartsWith(prefix) && O.IsValid).OrderByDescending(x => x.ContractCode)?.FirstOrDefault()?.ContractCode;
var code = contractCode == null ? "0" : contractCode.Substring(contractCode.Length - 2, 2);
var count = Convert.ToInt32(code) + 1;
contractNo = $"{prefix}{count.ToString().PadLeft(2, '0')}";
return contractNo;
}
/// <summary>
/// 仅支持生成提前终止和到期结算确认书编号
/// </summary>
/// <param name="contractIndex"></param>
/// <returns></returns>
private string GenerateZheQiContractNo(out string contractIndex)
{
contractIndex = "";
var tradeCash = TradeCashes[Trade.id].FirstOrDefault();
var db = DbContextFactory.GetYLDbContext();
var tradeQuery = db.trade.Where(O => O.ValidState != "InValid" && O.TradeDate == Trade.TradeDate);
var tradeTypeEn = "";
if (Trade.TradeType == "远期")
{
tradeQuery = tradeQuery.Where(O => O.TradeType == "远期");
if (Trade.StructureType == "掉期")
{
tradeTypeEn = "SW";
tradeQuery = tradeQuery.Where(O => O.StructureType == "掉期" || O.TradeType == "收益互换");
}
else
{
tradeTypeEn = "FW";
tradeQuery = tradeQuery.Where(O => O.StructureType != "掉期");
}
}
else if (Trade.TradeType == "收益互换")
{
tradeTypeEn = "SW";
tradeQuery = tradeQuery.Where(O => O.StructureType == "掉期" || O.TradeType == "收益互换");
}
else
{
var tradeTypes = new[] { "远期", "收益互换" };
tradeQuery = tradeQuery.Where(O => !tradeTypes.Contains(O.TradeType));
tradeTypeEn = "OP";
}
var actions = new[] { "系统操作-平仓费", "系统操作-行权费" };
var codeInfos = (from tc in db.trade_cash
join t in tradeQuery
on tc.TradeId equals t.id
join tr in db.trade_contract_r
on tc.id equals tr.TradeCashId into tempTr
from tr in tempTr.DefaultIfEmpty()
where tr.IsValid
&& tc.ValidState != "InValid" && tc.IsDeleted == false
&& tc.id != tradeCash.id && (actions.Contains(tc.Action) || tc.IsLastAction)
select new { tcId = tc.id, ContractCode = tr.ContractCode }).ToArray();
var tradeTag = "";
var client = DataCacheProvider.GetClientDataSource().GetData(Trade.ClientId);
tradeTag = $"{tradeTypeEn}{Trade.TradeDate?.ToString("yyMMdd")}";
var count = codeInfos.Count(O => O.tcId < tradeCash.id);
var tradeNumber = "";
do
{
count++;
tradeNumber = $"{client.Number}{tradeTag}{count.ToString("000")}Q";
} while (codeInfos.Any(O => O.ContractCode == tradeNumber) || ContractCodeCache.ContainsKey(tradeNumber));
var tcId = GetTradeCash().id;
ContractCodeCache[tradeNumber] = new[] { tcId, DateTime.Now.Ticks };
return tradeNumber;
}
/// <summary>
/// 检查生成的确认书编号是否存在
/// </summary>
/// <param name="contractNo"></param>
/// <returns></returns>
private bool CheckContractNo(string contractNo)
{
return DbContext.trade_contract_r.Any(O => O.ContractCode == contractNo);
}
private string GenerateRDXKContractNo()
{
var client = GetClient();
if (string.IsNullOrWhiteSpace(client.Code))
{ throw new TradeDocGenerateException("客户代码不应为空"); }
var prefix = $"RDXK-{client.Code}-";
if (Trade.TradeType == "远期")
{
if (Trade.StructureType == "掉期")
{
prefix += "SW-";
}
else
{
prefix += "FW-";
}
}
else if (Trade.TradeType == "亚式期权")
{
prefix += "AS-";
}
prefix += GetTradeCash().ValueDate.ToString("yyyyMMdd") + "-";
var contractNo = "";
var codes = DbContext.trade_contract_r.Where(O => O.ContractCode.StartsWith(prefix) && O.IsValid).Select(O => O.ContractCode).ToHashSet();
var count = codes.Count;
do
{
count++;
contractNo = prefix + count;
} while (codes.Contains(contractNo));
return contractNo;
}
private string GenerateZCContractNo(out string contractIndex)
{
var client = GetClient();
var ruleId = "";
var suffix = "";
switch (_contractType)
{
case ContractTypeEnum.Trade:
ruleId = "ZC";
break;
case ContractTypeEnum.Clearing:
ruleId = "ZCSettlement";
suffix = "S";
break;
case ContractTypeEnum.UnWind:
ruleId = "ZCUnWind";
suffix = " - 01";
break;
default:
break;
}
string code;
do
{
contractIndex = ContractBLL.GetRuleIndex(ruleId).ToString();
contractIndex = contractIndex.ToString().PadLeft(4, '0');
code = $"{client.Number}C{contractIndex}{suffix}";
} while (CheckContractNo(code));
return code;
}
private string GenerateGTJAContractNo(out string contractIndex)
{
var client = GetClient();
var ruleId = "";
var suffix = "";
var instrumentTypeArr = new List<string>() { ConsGlobal.InstrumentType.Stock, ConsGlobal.InstrumentType.StockIF, ConsGlobal.InstrumentType.StockIndex };
if (instrumentTypeArr.Contains(GetTradeUnderlying().UnderlyingInstrumentType) || Trade.TradeType == "雪球期权")
{
var date = GetTradeCash().ValueDate.ToString("yyyyMMdd");
if (StartDate != null && EndDate != null && StartDate != EndDate)
{
date = $"{StartDate.Value.ToString("yyyyMMdd")}-{EndDate.Value.ToString("yyyyMMdd")}";
}
contractIndex = date;
return $"{client.Number}-{date}-0";
}
else
{
switch (_contractType)
{
case ContractTypeEnum.Trade:
ruleId = "GTJA";
break;
case ContractTypeEnum.Clearing:
ruleId = "GTJASettlement";
suffix = "S";
break;
case ContractTypeEnum.UnWind:
ruleId = "GTJAUnWind";
suffix = " - 01";
break;
default:
break;
}
string code;
do
{
contractIndex = ContractBLL.GetRuleIndex(ruleId).ToString();
contractIndex = contractIndex.ToString().PadLeft(4, '0');
code = $"{client.Number}C{contractIndex}{suffix}";
} while (CheckContractNo(code));
return code;
}
}
private string GenerateHTContractNo()
{
string contractNo;
var date = GetTradeCash().ValueDate;
var valueDates = new List<DateTime>();
foreach (var item in TradeCashes.Values)
{ valueDates.AddRange(item.Select(O => O.ValueDate).ToList()); }
if (valueDates.ToHashSet().Count > 1) { throw new ArgumentException((_contractType == ContractTypeEnum.Trade ? "交易" : "结算") + "日期不正确"); }
var prefix = $"{_client.Number}{date:yyyyMMdd}";
switch (_contractType)
{
case ContractTypeEnum.Trade:
prefix += "T";
break;
case ContractTypeEnum.Clearing:
case ContractTypeEnum.UnWind:
prefix += "S";
break;
default:
break;
}
var codes = DbContext.trade_contract_r.Where(O => O.ContractCode.StartsWith(prefix) && O.IsValid).Select(O => O.ContractCode).ToHashSet();
var count = codes.Count;
do
{
count++;
contractNo = prefix + count;
} while (codes.Contains(contractNo));
return contractNo;
}
private string GenerateWCZDContractNo()
{
var prefix = GetClient().Number + "-" + DateTime.Now.ToString("yyyyMMdd");
var contractNo = "";
var contracts = DbContext.trade_contract_r.Where(_ => Trade.id == (_.TradeId) && _.Type == _contractType && _.IsValid);
if (contracts != null && contracts.Any())
{
contractNo = contracts.First().ContractCode;
}
else
{
var codes = DbContext.trade_contract_r.Where(O => O.ContractCode.StartsWith(prefix) && O.IsValid).Select(O => O.ContractCode).ToHashSet();
var count = codes.Count;
do
{
count++;
contractNo = prefix + count.ToString("D3");
} while (codes.Contains(contractNo));
}
return contractNo;
}
public string GenerateWCZDChildrenContractNo(int tId, int tcId)
{
//所有确认书编号都在trademate里面存取
@@ -1961,355 +1408,6 @@ namespace YLErp.Modules.TradeModule.DocGenerateModule
{
return DbContext.trade_contract_r_number.Where(O => O.TradeId == tId && O.TradeCashId == tcId && O.TradeConfirmNumberType == type).FirstOrDefault().TradeConfirmNumber;
}
private string GenerateHYContractNo()
{
if (string.IsNullOrWhiteSpace(_client.Code))
{
throw new TradeDocGenerateException("生成合同编号失败,请先添加客户代码!");
}
if (string.IsNullOrWhiteSpace(_client.Abbreviation))
{
throw new TradeDocGenerateException("生成合同编号失败,请先添加客户简称!");
}
if (!_client.ProtocolSignDate.HasValue)
{
throw new TradeDocGenerateException("生成合同编号失败,请先添加客户商品类协议签署日期!");
}
var tradeCount =
DbContext.trade
.Where(O =>
O.ClientId == _client.id
&& O.ParentTradeId == 0
&& O.ValidState != "InValid"
&& O.id < Trade.id).Count();
string code;
do
{
tradeCount += 1;
code = $"HL-{_client.Code}-{_client.ProtocolSignDate?.ToString("yyyy")}-{_client.Abbreviation}-SAC-01-1-TC{tradeCount:000}";
} while (CheckContractNo(code));
return code;
}
private string GenerateCJContractNo()
{
var contractNo = "";
var tradeIndex = 1;
var groupIndex = 1;
var tradeId = 0;
var date = DateTime.MinValue;
var unwindCount = "";
var query = DbContext.trade.Where(O => O.ValidState != "InValid");
if (Trade.GroupId.HasValue)
{
var trades = query.Where(O => O.GroupName == Trade.GroupName).OrderBy(O => O.id).ToList();
groupIndex = trades.Where(O => O.id <= Trade.id).Count();
tradeId = trades[0].id;
}
query = query.Where(O => ConsTrade.OptionTradeTypes.Contains(O.TradeType));
switch (_contractType)
{
case ContractTypeEnum.Trade:
date = Trade.TradeDate ?? date;
query = query.Where(O => O.TradeDate == Trade.TradeDate);
break;
case ContractTypeEnum.UnWind:
date = Trade.UnWindDate ?? date;
query = query.Where(O => O.UnWindDate == Trade.UnWindDate);
unwindCount = UnwindCount().ToString();
break;
case ContractTypeEnum.Clearing:
date = Trade.ExerciseDate ?? date;
query = query.Where(O => O.ExerciseDate == Trade.ExerciseDate);
break;
default: return contractNo;
}
var prefixStr = $"CJ{date:yyyyMMdd}";
var codes = DbContext.trade_contract_r.Where(O => O.IsValid).Join(query, TCR => TCR.TradeId, T => T.id, (TCR, T) => TCR.ContractCode).ToList();
codes = codes.Union(DbContext.trade_contract_r.Where(O => O.ContractCode.StartsWith(prefixStr) && O.IsValid).Select(O => O.ContractCode).ToList()).ToList();
var metaKey = $"{date:yyyy-MM-dd}_{_contractType}{unwindCount}";
TradeMeta meta = null;
if ((meta = DbContext.TradeMeta.Where(O => O.TradeId == Trade.id && O.MetaKey == metaKey).FirstOrDefault()) != null)
{ contractNo = meta.MetaValue; }
else
{
meta = new TradeMeta
{
TradeId = Trade.id,
MetaKey = metaKey,
CreateTime = DateTime.Now
};
DbContext.TradeMeta.Add(meta);
}
if (string.IsNullOrWhiteSpace(contractNo) || codes.Contains(contractNo))
{
var prefix = date.ToString("yyyy-MM-dd_");
codes.AddRange(
DbContext.TradeMeta
.Where(O => O.MetaKey.StartsWith(prefix))
.Select(O => O.MetaValue).ToList());
if (query.Where(O => O.id == tradeId).Count() == 0) { tradeId = Trade.id; }
if (Trade.GroupId.HasValue) { query = query.Where(O => O.GroupId != Trade.GroupId); }
query = query.Where(O => O.id < tradeId);
tradeIndex = query.Where(O => O.GroupId != null).AsEnumerable().GroupBy(O => O.GroupId).Count();
tradeIndex += query.Where(O => O.GroupId == null).Count();
do
{
tradeIndex++;
contractNo = $"{prefixStr}{tradeIndex:D2}{groupIndex:D3}";
}
while (codes.Contains(contractNo));
meta.MetaValue = contractNo;
DbContext.SaveChanges();
}
return contractNo;
}
private string GenerateSQContractNo(out string contractIndex)
{
var code = "";
contractIndex = "";
var clientObj = GetClient();
var date = DateTime.MinValue;
var unwindCount = "";
var query = DbContext.trade.Where(O => O.ValidState != "InValid");
switch (_contractType)
{
case ContractTypeEnum.Trade:
date = Trade.TradeDate ?? date;
query = query.Where(O => O.TradeDate == Trade.TradeDate);
break;
case ContractTypeEnum.UnWind:
date = Trade.UnWindDate ?? date;
query = query.Where(O => O.UnWindDate == Trade.UnWindDate);
unwindCount = UnwindCount().ToString();
break;
case ContractTypeEnum.Clearing:
date = Trade.ExerciseDate ?? date;
query = query.Where(O => O.ExerciseDate == Trade.ExerciseDate);
break;
default: return code;
}
var prefix = $"{clientObj.Number}-JY-{date:yyyyMMdd}";
var codes = DbContext.trade_contract_r.Where(O => O.ContractCode.StartsWith(prefix) && O.IsValid).Select(O => O.ContractCode).ToList();
var metaKey = $"{date:yyyy-MM-dd}_{_contractType}{unwindCount}";
TradeMeta meta = null;
if ((meta = DbContext.TradeMeta.Where(O => O.TradeId == Trade.id && O.MetaKey == metaKey).FirstOrDefault()) != null)
{ code = meta.MetaValue; }
else
{
meta = new TradeMeta
{
TradeId = Trade.id,
MetaKey = metaKey,
CreateTime = DateTime.Now
};
DbContext.TradeMeta.Add(meta);
}
if (string.IsNullOrWhiteSpace(code) || codes.Contains(code))
{
var tradeCodes = codes
.Where(O => O.Contains(prefix))
.OrderByDescending(O => O);
var tradeCode = tradeCodes.FirstOrDefault();
if (string.IsNullOrWhiteSpace(tradeCode) || !int.TryParse(tradeCode.Substring(prefix.Length).TrimEnd(), out var tradeCount))
{
tradeCount = 0;
}
do
{
tradeCount++;
contractIndex = tradeCount.ToString("00");
code = $"{prefix}{contractIndex}";
} while (codes.Contains(code));
meta.MetaValue = code;
DbContext.SaveChanges();
}
return code;
}
private string GenerateDFCFContractNo(out string contractIndex)
{
var client = GetClient();
var Abbreviation = client != null ? client.Abbreviation : "";
if (client.ClientType == "产品") Abbreviation = client != null ? client.AdminFullName : "";
var date = DateTime.Now.ToString("yyyy");
var ruleId = "DFCF-" + Abbreviation + "-" + date;
string code;
do
{
contractIndex = ContractBLL.GetRuleIndex(ruleId).ToString();
contractIndex = contractIndex.ToString().PadLeft(3, '0');
code = $"{ruleId}-{contractIndex}";
} while (CheckContractNo(code));
return code;
}
private string GenerateGHContractNo(out string contractIndex)
{
var date = DateTime.Now.ToString("yyyy");
var client = GetClient();
var Abbreviation = client != null ? client.Abbreviation : "";
if (client.ClientType == "产品") Abbreviation = client != null ? client.AdminFullName : "";
var ruleId = "GH-" + Abbreviation + "-" + date;
string code;
do
{
contractIndex = ContractBLL.GetRuleIndex(ruleId).ToString();
contractIndex = contractIndex.ToString().PadLeft(4, '0');
code = $"{ruleId}-{contractIndex}";
} while (CheckContractNo(code));
return code;
}
private string GenerateDongGuanContractNo(out string contractIndex)
{
var code = string.Empty;
var codes = DbContext.trade_contract_r.Where(n => n.TradeId == Trade.id && n.Type == "交易确认书")
.OrderBy(n => n.id).Select(n => new { n.ContractCode, n.IsValid }).ToArray();
if (codes.Length > 0)
{
code = (codes.FirstOrDefault(n => n.IsValid) ?? codes[0]).ContractCode;
var index = code.LastIndexOf('-');
contractIndex = index > 0 ? code.Substring(index + 1) : string.Empty;
}
else
{
var date = DateTime.Now.ToString("yyyy");
var client = GetClient();
var Abbreviation = client != null ? client.Abbreviation : "";
if (client.ClientType == "产品") Abbreviation = client != null ? client.AdminFullName : "";
var ruleId = "DG-" + Abbreviation + "-" + date;
do
{
contractIndex = ContractBLL.GetRuleIndex(ruleId).ToString();
contractIndex = contractIndex.ToString().PadLeft(4, '0');
code = $"{ruleId}-{contractIndex}";
} while (CheckContractNo(code));
}
return code;
}
private string GenerateTFContractNo(out string contractIndex)
{
var date = DateTime.Now.ToString("yyyy");
var client = GetClient();
var Abbreviation = client != null ? client.Abbreviation : "";
if (client.ClientType == "产品") Abbreviation = client != null ? client.AdminFullName : "";
var ruleId = "TF-" + Abbreviation + "-" + date;
string code;
do
{
contractIndex = ContractBLL.GetRuleIndex(ruleId).ToString();
contractIndex = contractIndex.ToString().PadLeft(4, '0');
code = $"{ruleId}-{contractIndex}";
} while (CheckContractNo(code));
return code;
}
private string GenerateSXContractNo(out string contractIndex)
{
var date = DateTime.Now.ToString("yyyy");
var client = GetClient();
var Abbreviation = client != null ? client.Abbreviation : "";
if (client.ClientType == "产品") Abbreviation = client != null ? client.AdminFullName : "";
var ruleId = "SX-" + Abbreviation + "-" + date;
string code;
do
{
contractIndex = ContractBLL.GetRuleIndex(ruleId).ToString();
contractIndex = contractIndex.ToString().PadLeft(4, '0');
code = $"{ruleId}-{contractIndex}";
} while (CheckContractNo(code));
return code;
}
private string GenerateGQContractNo(out string contractIndex)
{
var date = DateTime.Now.ToString("yyyyMMdd");
var ruleId = "GQZB" + date + "FUT";
string code;
do
{
contractIndex = ContractBLL.GetRuleIndex(ruleId).ToString();
contractIndex = contractIndex.ToString().PadLeft(4, '0');
code = $"{ruleId}-{contractIndex}";
} while (CheckContractNo(code));
return code;
}
private string GenerateGXJYContractNo(out string contractIndex)
{
contractIndex = "";
var tc = GetTradeCash();
var date = tc.ValueDate;
if (string.IsNullOrEmpty(_client.MainProtocolCode))
{
throw new ServiceException("找不到该数据主协议编号");
}
var clientMainProtocolCode = _client.MainProtocolCode;
var preTag = clientMainProtocolCode ?? "N";
//合并起来作为获取递增序号的取值条件
var leftPart = preTag;
var fullSize = leftPart.Length + 3;
var db = DbContextFactory.GetYLDbContext();
var tradeNumbers = db.trade.Where(x => x.TradeNumber.StartsWith(leftPart) && x.TradeNumber.Length >= fullSize)
.OrderByDescending(x => x.TradeNumber).Select(n => n.TradeNumber).ToList();
var numberStrings = tradeNumbers.Select(x => x.Substring(leftPart.Length).IndexOf('-') > 0 ? x.Substring(leftPart.Length).Remove(x.Substring(leftPart.Length).IndexOf('-')) : x.Substring(leftPart.Length)).Where(x => int.TryParse(x, out var num));
var number = numberStrings.LongCount() > 0 ? numberStrings.Max(x => int.TryParse(x, out var a) ? a : 0) : 0;
//获取总的该用户最大的交易编号记录
var newNumber = number == 0 ? 1 : (number + 1);
//获取提前终止数量
var tradeUnwindConfirmationNumbers = db.trade_contract_r.Where(l => l.TradeNumber.StartsWith(leftPart) && l.TradeNumber.Length >= fullSize && l.Type == "提前终止确认书" && l.IsValid).Select(n => n.ContractCode).ToList();
var tradeUnwindConfirmationNumberStrings = tradeUnwindConfirmationNumbers.Select(x => x.Contains(leftPart) ? (x.Substring(leftPart.Length).IndexOf('-') > 0 ? x.Substring(leftPart.Length).Remove(x.Substring(leftPart.Length).IndexOf('-')) : x.Substring(leftPart.Length)) : "1").Where(x => int.TryParse(x, out var num));
var tradeUnwindConfirmationCount = tradeUnwindConfirmationNumberStrings.Max(x => x);
if (newNumber > (string.IsNullOrWhiteSpace(tradeUnwindConfirmationCount) ? 0 : (int.Parse(tradeUnwindConfirmationCount) + 1)))
{
return getTradeNumber(newNumber, leftPart, db);
}
else
{
return getTradeNumber(int.Parse(tradeUnwindConfirmationCount) + 1, leftPart, db);
}
}
private string getTradeNumber(int newNumber, string leftPart, YLContext db)
{
if (newNumber < 1e3)
{
var childTradeNumberPart = leftPart + newNumber.ToString("D3");
if (db.trade.Any(x => x.TradeNumber.Contains(childTradeNumberPart) && db.trade_contract_r.Any(l => l.ContractCode.Contains(childTradeNumberPart)) && x.ValidState != "InValid"))
{
return getTradeNumber(newNumber + 1, leftPart, db);
}
else
{
return leftPart + newNumber.ToString("D3");
}
}
else
{
var childTradeNumberPart = leftPart + newNumber;
if (db.trade.Any(x => x.TradeNumber.Contains(childTradeNumberPart) && db.trade_contract_r.Any(l => l.ContractCode.Contains(childTradeNumberPart)) && x.ValidState != "InValid"))
{
return getTradeNumber(newNumber + 1, leftPart, db);
}
else
{
return childTradeNumberPart;
}
}
}
/// <summary>
/// 获取价差期权 组合标的最大价格
/// </summary>