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
@@ -842,25 +842,10 @@ namespace YLErp.Modules.ReportModule
bool isShowMargin = false;
var sourcePath = OtcAppContext.MapPath("~/App_Docs/导出模板");
string sourceFileName;
switch (PS.Config.Company)
sourceFileName = Path.Combine(sourcePath, $"结算报告模板_{PS.Config.Company}.xlsx");
if (!File.Exists(sourceFileName))
{
case CompanyEnum.:
//isShowMargin = new TradeMarketReportConfigureService(UserInfo).IsShowMarginByTradeMarketReportConfigure(report.client.id);
sourceFileName = Path.Combine(sourcePath, isShowMargin ? "结算报告模板_国君_含预付金.xlsx" : "结算报告模板_国君.xlsx");
break;
case CompanyEnum.:
sourceFileName = Path.Combine(sourcePath, "结算报告模板_弘业.xlsx");
break;
case CompanyEnum.:
sourceFileName = Path.Combine(sourcePath, "结算报告模板_东证.xlsx");
break;
default:
sourceFileName = Path.Combine(sourcePath, $"结算报告模板_{PS.Config.Company}.xlsx");
if (!File.Exists(sourceFileName))
{
sourceFileName = Path.Combine(sourcePath, "结算报告模板.xlsx");
}
break;
sourceFileName = Path.Combine(sourcePath, "结算报告模板.xlsx");
}
if (PS.Config.ErpElement.ForwardTradePriceModel == Configuration.Enums.ForwardTradePriceModel.STANDARD)
{
@@ -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>
@@ -1693,21 +1693,7 @@ namespace YLErp.Web.Controllers
string[] errors = null;
switch (PS.Config.Company)
{
case CompanyEnum.:
RDBatchGenerateContracts(contractFiles, ClientIds, TradeIds, out errors);
break;
case CompanyEnum.:
HTBatchGenerateContracts(contractFiles, ClientIds, TradeIds, out errors);
break;
case CompanyEnum.:
GLDHBatchGenerateContracts(contractFiles, ClientIds, TradeIds, TradeDateStart, TradeDateEnd, out errors);
break;
default:
DefaultBatchGenerateContracts(contractFiles, ClientIds, TradeIds, TradeDateStart, TradeDateEnd, out errors);
break;
}
DefaultBatchGenerateContracts(contractFiles, ClientIds, TradeIds, TradeDateStart, TradeDateEnd, out errors);
if (errors != null && errors.Any())
{
@@ -1724,267 +1710,6 @@ namespace YLErp.Web.Controllers
}
/// <summary>
/// 瑞达批量处理
/// </summary>
private void RDBatchGenerateContracts(List<string> contractFiles, string ClientIds, string TradeIds, out string[] errors)
{
errors = null;
if (string.IsNullOrWhiteSpace(TradeIds))
{ throw new ArgumentException("请勾选交易"); }
List<int> tids = new List<int>();
TradeIds?.Split(',')?.ToList()?.ForEach(g =>
{
var tid = Convert.ToInt32(g.Trim());
tids.Add(tid);
});
var tradeTypeArr = new List<string>() { "远期", "亚式期权" };
var query =
from t in yldb.trade
where
tids.Contains(t.id)
select new
{
t.id,
t.ClientId,
t.TradeDate,
tradeType = tradeTypeArr.Contains(t.TradeType) ? t.TradeType : "Normal",
IsSW = t.StructureType == "掉期" ? "0" : "1"
};
if (!query.Any())
{
throw new ArgumentException("请勾选交易");
}
if (!ClientIds.IsNullOrWhiteSpace())
{
var ids = ClientIds.Split(',');
query = query.Where(O => ids.Contains(O.ClientId + ""));
}
var clientTradeDict =
query.AsEnumerable().GroupBy(O => O.ClientId + " " + O.TradeDate + " " + O.tradeType + " " + O.IsSW)
.ToDictionary(K => K.Key, V => V.Select(O => O.id).ToList());
foreach (var trades in clientTradeDict)
{
var results =
new BatchConfirmationGenerateService(CurUser).Generate(trades.Value, "PDF");
errors = results.Where(n => !string.IsNullOrWhiteSpace(n.ErrorMessage)).Select(n => n.ErrorMessage).ToArray();
contractFiles = results.Where(n => !string.IsNullOrWhiteSpace(n.OutputFilePath)).Select(n => n.OutputFilePath).ToList();
if (errors.Any())
{
return;
}
}
}
/// <summary>
/// 海通批量生成
/// </summary>
private void HTBatchGenerateContracts(List<string> contractFiles, string ClientIds, string TradeIds, out string[] errors)
{
errors = null;
if (string.IsNullOrWhiteSpace(TradeIds))
{ throw new ArgumentException("请勾选交易"); }
var tids = TradeIds.Split(',').ToList();
var intTids = new List<int>();
tids.ForEach(g => intTids.Add(Convert.ToInt32(g)));
var query =
from t in yldb.trade
where
intTids.Contains(t.id)
select new { t.id, t.ClientId };
if (!query.Any())
{
throw new ArgumentException("请勾选交易");
}
if (!ClientIds.IsNullOrWhiteSpace())
{
var ids = ClientIds.Split(',');
query = query.Where(O => ids.Contains(O.ClientId + ""));
}
var clientTradeDict =
query.AsEnumerable().GroupBy(O => O.ClientId)
.ToDictionary(K => K.Key, V => V.Select(O => O.id).ToList());
foreach (var trades in clientTradeDict)
{
var results =
new BatchConfirmationGenerateService(CurUser).Generate(trades.Value, "PDF");
errors = results.Where(n => !string.IsNullOrWhiteSpace(n.ErrorMessage)).Select(n => n.ErrorMessage).ToArray();
contractFiles = results.Where(n => !string.IsNullOrWhiteSpace(n.OutputFilePath)).Select(n => n.OutputFilePath).ToList();
if (errors.Any())
{
return;
}
}
}
/// <summary>
/// 格林大华
/// </summary>
private void GLDHBatchGenerateContracts(List<string> contractFiles, string ClientIds, string TradeIds, DateTime? TradeDateStart, DateTime? TradeDateEnd, out string[] errors)
{
errors = null;
//需要生成交易确认书的状态
var NeedGenTradeStatus = new List<string> { ConsTrade., ConsTrade., ConsTrade., ConsTrade., ConsTrade., ConsTrade., ConsTrade. };
//渠道商信息
var broker = DataCacheProvider.GetClientDataSource().AsQueryable().FirstOrDefault(x => x.Name == PS.Config.CompanyFullName);
//渠道服务商 配置信息
var spc0 = ServicerePresentativeConfigService.GetData(0);
if (spc0 == null)
{
throw new InvalidOperationException("未找到服务商信息");
}
if (broker == null)
{
errors = new string[1] { "渠道交易渠道商字段[BrokerClientName]未配置" };
return;
}
//查询所有待生成交易确认书的场外期权交易
var query = yldb.trade.Where(t => NeedGenTradeStatus.Contains(t.TradeStatus)
&& t.ValidState != "InValid" && t.ClientId > 0
&& ConsTrade.TradeTypesForOtcOptions.Contains(t.TradeType));
if (string.IsNullOrWhiteSpace(TradeIds))
{
query = query.Where(t => t.TradeDate >= TradeDateStart && t.TradeDate <= TradeDateEnd);
if (!string.IsNullOrWhiteSpace(ClientIds))
{
var clientIdList = (ClientIds + "").Split(","[0]).Select(c => Convert.ToInt32(c)).ToList();
query = query.Where(t => clientIdList.Contains(t.ClientId));
}
}
else
{
var tradeIdList = TradeIds.Split(',').Select(t => Convert.ToInt32(t)).ToList();
query = query.Where(t => tradeIdList.Contains(t.id));
}
//获取生成日期区间
var allTradeList = query.ToList();
TradeDateStart = allTradeList.Min(t => t.TradeDate);
TradeDateEnd = allTradeList.Max(t => t.TradeDate);
if (allTradeList.Count == 0)
{
errors = new string[1] { "当前选择的[客户][交易日区间]条件下未找到可生成交易确认书的交易!" };
return;
}
//AppManager.TryResolve(out IBatchTradeConfirmationGenerator batchTradeConfirmationGenerator);
//IBatchTradeDocGeneratorContext context = new BatchTradeDocGeneratorContext("Pdf", CurUser.UserId, CurUser.UserName, broker, spc0, valuedateBLL.SystemDate, Server.MapPath("/App_Docs"));
//batchTradeConfirmationGenerator.Initialize(context);
var tradeIds = allTradeList.Select(t => t.id).ToList();
//当日交易对应的所有对应关系
var tradeContractRList = yldb.trade_contract_r.Where(t => tradeIds.Contains(t.TradeId) && t.Type == ContractTypeEnum.Trade && t.IsValid).ToList();
var tempEnum = (TradeConfirmContractMode)Enum.Parse(typeof(TradeConfirmContractMode), string.IsNullOrEmpty(valuedateBLL.SystemDate.TradeContractDocMode) ? "单笔模式" : valuedateBLL.SystemDate.TradeContractDocMode);
var tempGroupList = new List<TradeConfirmContractGroupModel>();
switch (tempEnum)
{
case TradeConfirmContractMode.:
foreach (var trade in allTradeList)
{
contractFiles.Add(CreateTradeConfirmation(trade, spc0));
}
break;
case TradeConfirmContractMode.:
tempGroupList = allTradeList.Select(t => Tuple.Create(t.ClientId, t.TradeDate.Value)).Distinct().Select(t => new TradeConfirmContractGroupModel { ClientId = t.Item1, ValueDate = t.Item2 }).OrderBy(t => t.ValueDate).ToList();
break;
case TradeConfirmContractMode.:
tempGroupList = allTradeList.Select(t => Tuple.Create(t.ClientId, t.TradeDate.Value, t.UnderlyingInstrumentType)).Distinct().Select(t => new TradeConfirmContractGroupModel { ClientId = t.Item1, ValueDate = t.Item2, UnderlyingType = t.Item3 }).OrderBy(t => t.ValueDate).ThenBy(t => t.ClientId).ThenBy(t => t.UnderlyingType).ToList();
break;
case TradeConfirmContractMode.:
tempGroupList = allTradeList.Select(t => Tuple.Create(t.ClientId, t.TradeDate.Value, t.UnderlyingInstrumentType, t.BuySell)).Distinct().Select(t => new TradeConfirmContractGroupModel { ClientId = t.Item1, ValueDate = t.Item2, UnderlyingType = t.Item3, BuySell = t.Item4 }).OrderBy(t => t.ValueDate).ThenBy(t => t.ClientId).ThenBy(t => t.UnderlyingType).ToList();
break;
//case TradeConfirmContractMode.申银万国模式:
// break;
default:
break;
}
//分组生成确认书
foreach (var item in tempGroupList)
{
//客户信息
var client = DataCacheProvider.GetClientDataSource().GetData(item.ClientId);
if (client == null)
{
throw new InvalidOperationException($"找不到id为{item.ClientId}的客户");
}
//当前条件生成交易确认书的交易列表
var tempQuery = allTradeList.Where(t => t.TradeDate == item.ValueDate && t.ClientId == item.ClientId);
if (!string.IsNullOrEmpty(item.UnderlyingType))
{
tempQuery = tempQuery.Where(t => t.UnderlyingInstrumentType == item.UnderlyingType);
}
if (!string.IsNullOrEmpty(item.BuySell))
{
tempQuery = tempQuery.Where(t => t.BuySell == item.BuySell);
}
var tempTradeList = tempQuery.ToList();
var contractVersion = spc0.StockBuyContractVersion;
if ("STO".Equals(item.UnderlyingTypeShort))
{
contractVersion = "买入".Equals(item.BuySell) ? spc0.StockSellContractVersion : spc0.StockBuyContractVersion;
}
else
{
contractVersion = "买入".Equals(item.BuySell) ? spc0.FutureSellContractVersion : spc0.FutureBuyContractVersion;
}
if (string.IsNullOrEmpty(contractVersion))
{
throw new InvalidOperationException($"未为渠道商设置商品期货期权交易确认书版本");
}
var tradeContractMode = new TradeContractModeUtils(broker, client, item.BuySell);
//当前客户当前买卖方向所有交易
var tempTradeIds = tempTradeList.Select(t => t.id).ToList();
//交易的确认书List
var tempTradeContractList = tradeContractRList.Where(t => tempTradeIds.Contains(t.TradeId) && !string.IsNullOrEmpty(t.ContractCode)).ToList();
//交易合约书code list
var tradeContractCodes = tempTradeContractList.Select(t => t.ContractCode).Distinct().ToList();
var tradeHasTrades = tempTradeContractList.Select(t => t.TradeId).Distinct().ToList();
//处理所有已生成交易确认书的交易重新生成时保持交易确认书编号不变
if (tempTradeContractList.Count > 0)
{
var row = 0;
for (var j = 0; j < tradeContractCodes.Count; j++)
{
var ContractCode = tradeContractCodes[j];
var tempIds = tradeContractRList.Where(t => t.ContractCode == ContractCode).Select(t => t.TradeId).ToList();
if (tempIds.Count == 0)
{
continue;
}
var contractTrade = tempTradeList.Where(x => tempIds.Contains(x.id)).ToList();
//默认
if (row == 0)
{
row++;
//没有交易编号的生成
var tradeTemp = tempTradeList.Where(x => !tradeHasTrades.Contains(x.id)).ToList();
contractTrade.AddRange(tradeTemp);
}
contractFiles.Add(CreateBatchTradeConfirmation(contractTrade, contractVersion, spc0, tradeContractMode.FirstParty, tradeContractMode.SecondParty, item.ValueDate, ContractCode, item.UnderlyingTypeShort));
}
}
else
{
//剔除已经单独生成交易确认书的交易
var tradeTemp = tempTradeList.Where(t => !"是".Equals(t.IsSingleContract)).ToList();
var tradeCodePrefix = GetTradeContractNumber(broker, client, item.ValueDate, item.BuySell, item.UnderlyingTypeShort);
contractFiles.Add(CreateBatchTradeConfirmation(tradeTemp, contractVersion, spc0, tradeContractMode.FirstParty, tradeContractMode.SecondParty, item.ValueDate, tradeCodePrefix, underlyingTypeStr: item.UnderlyingTypeShort));
}
}
}
private void DefaultBatchGenerateContracts(List<string> contractFiles, string ClientIds, string TradeIds, DateTime? TradeDateStart, DateTime? TradeDateEnd, out string[] errors)
{
errors = null;
@@ -2244,21 +1969,7 @@ namespace YLErp.Web.Controllers
/// </summary>
private string GetTradeContractNumber(Client broker, Client client, DateTime date, string buySell, string underlyingType, bool IsSingle = false, string TradeType = null)
{
switch (PS.Config.Company)
{
case CompanyEnum.:
switch (buySell)
{
case "买入":
return $"{client.Code}-{date:yyMMdd}-{(IsSingle ? "M" : ("STO".Equals(underlyingType) ? "F" : "B"))}";
case "卖出":
return $"{client.Code}-{date:yyMMdd}-{(IsSingle ? "M" : ("STO".Equals(underlyingType) ? "E" : "A"))}";
default:
return "";
}
default:
return $"{broker.Code}{date:yyyyMMdd}{underlyingType}-{client.id}{("".Equals(buySell) ? "S" : "B")}";
}
return $"{broker.Code}{date:yyyyMMdd}{underlyingType}-{client.id}{("".Equals(buySell) ? "S" : "B")}";
}
private string ToStringFillUpZero(int number, int length)
+1 -9
View File
@@ -6,15 +6,7 @@ namespace YLErp.Web.Models
{
public static bool HasExtendVol()
{
switch (PS.Config.Company)
{
default: return false;
case CompanyEnum.:
case CompanyEnum.:
case CompanyEnum.:
case CompanyEnum.:
return true;
}
return false;
}
///// <summary>