185 lines
7.7 KiB
C#
185 lines
7.7 KiB
C#
using YLErp.BLL;
|
|
using YLErp.Modules;
|
|
using YLErp.Modules.TradeModule;
|
|
|
|
namespace YLErp.CustomizedBizLogic
|
|
{
|
|
/// <summary>
|
|
/// 招证
|
|
/// </summary>
|
|
public class BizLogicZhaoZheng : BizLogicDefault
|
|
{
|
|
/// <summary>
|
|
/// 生成客户编号
|
|
/// </summary>
|
|
/// <param name="clientObj"></param>
|
|
/// <param name="clientDbQuery"></param>
|
|
public override void GenerateClientCode(DBModels.Client clientObj, IQueryable<DBModels.Client> clientDbQuery)
|
|
{
|
|
//定义固定字段
|
|
var predfix = "9";
|
|
//判断客户编号是否为空
|
|
if (!string.IsNullOrEmpty(clientObj.Number)) { return; }
|
|
var existsClientCodes = clientDbQuery.Where(x => x.Number != null && x.Number != "" && x.Number.Length == 8 && x.Number.StartsWith(predfix)).Select(x => x.Number).ToList();
|
|
|
|
var number = 0;
|
|
|
|
if (existsClientCodes.Any())
|
|
{
|
|
//获取最大客户编号
|
|
number = existsClientCodes.Select(x => /*Regex.IsMatch(x, @"^[0-9]*$")*/int.TryParse(x, out var o) ? o : 0).Max();
|
|
}
|
|
if (number == 0)
|
|
{
|
|
number = 90000000;
|
|
}
|
|
number++;
|
|
clientObj.Number = number.ToString();
|
|
}
|
|
/// <summary>
|
|
/// 在交易确认前生成交易编号
|
|
/// </summary>
|
|
public override string GenerateTradeNumberBeforeConfirm(TradeNumberReqModel reqModel, YLContext db)
|
|
{
|
|
if (reqModel is null)
|
|
{
|
|
throw new ArgumentNullException(nameof(reqModel));
|
|
}
|
|
//根据客户Id查询出该客户
|
|
var client = DataCacheProvider.GetClientDataSource().GetData(reqModel.clientId);
|
|
if (client == null)
|
|
{
|
|
throw new Exception("未找到客户");
|
|
}
|
|
//取出客户编号
|
|
var clientNumber = client.Number;
|
|
//判断客户编号是否为空
|
|
if (string.IsNullOrWhiteSpace(clientNumber))
|
|
{
|
|
throw new Exception("客户编号不能为空");
|
|
}
|
|
//判断开仓时间是否为空
|
|
if (!reqModel.trade.TradeDate.HasValue)
|
|
{
|
|
throw new Exception("交易日期不存在,无法生成交易编号!");
|
|
}
|
|
var date = reqModel.trade.TradeDate?.ToString("yyyyMMdd");
|
|
|
|
// LogFactory.GetLogger("招证").Info("开始生成交易编号");
|
|
var dealNumber = GenerateZhaoZhengDealNumber(reqModel.trade, date, O => { return db.trade.Where(t => t.TradeNumber.StartsWith(O)).Select(O => O.TradeNumber).ToArray(); });//获取
|
|
reqModel.trade.MetaDic ??= new Dictionary<string, string>();
|
|
reqModel.trade.MetaDic["期货报送成交编号"] = dealNumber;
|
|
|
|
return dealNumber;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 生成招证成交编号
|
|
/// </summary>
|
|
/// <param name="reqModel"></param>
|
|
/// <param name="date"></param>
|
|
/// <param name="keyId">
|
|
/// <para>了结时:TradeCashId</para>
|
|
/// </param>
|
|
/// <returns></returns>
|
|
public string GenerateZhaoZhengDealNumber(OtcTradeBase trade, trade_cash tradeCash)
|
|
{
|
|
if (trade is null)
|
|
{
|
|
throw new ArgumentNullException(nameof(trade));
|
|
}
|
|
|
|
if (tradeCash is null)
|
|
{
|
|
throw new ArgumentNullException(nameof(tradeCash));
|
|
}
|
|
|
|
var date = tradeCash.ValueDate.ToString("yyyyMMdd");
|
|
var metaKey = "期货报送成交编号" + tradeCash.id;
|
|
var service = new TradeMetaService(new OptUserInfo(trade.OptId, trade.OptName, OptUserFrom.WebUI));
|
|
var dealNumber = service.GetTradeMeta(trade.id, metaKey);
|
|
if (string.IsNullOrWhiteSpace(dealNumber))
|
|
{
|
|
dealNumber = null;
|
|
if (trade.ParentTradeId > 0 && trade.IsGroup == 0 && tradeCash.Action != ClientCashInCashOut.系统操作_期权费)
|
|
{
|
|
using var db = DbContextFactory.GetYLDbContext();
|
|
|
|
var prefix = GetZhaoZhengDealNumberPrefix(trade, date, out _);
|
|
|
|
var metaQuery = from tc in db.trade_cash
|
|
join td in db.trade on tc.TradeId equals td.id
|
|
join meta in db.TradeMeta on tc.TradeId equals meta.TradeId
|
|
where td.id != trade.id
|
|
&& td.ParentTradeId == trade.ParentTradeId
|
|
&& tc.ValueDate == tradeCash.ValueDate
|
|
&& tc.Action == tradeCash.Action
|
|
&& tc.ValidState != ConsGlobal.InValid
|
|
&& !tc.IsDeleted
|
|
&& meta.MetaKey.StartsWith("期货报送成交编号")
|
|
&& meta.MetaValue.StartsWith(prefix)
|
|
select new { meta.MetaValue };
|
|
|
|
var metaDto = metaQuery.FirstOrDefault();
|
|
|
|
if (!string.IsNullOrEmpty(metaDto?.MetaValue))
|
|
{
|
|
dealNumber = metaDto.MetaValue;
|
|
}
|
|
}
|
|
|
|
//LogFactory.GetLogger("招证").Info($"开始生成交易编号{metaKey}");
|
|
|
|
dealNumber ??= GenerateZhaoZhengDealNumber(trade, date);//获取
|
|
|
|
new TradeMetaService(new OptUserInfo(trade.OptId, trade.OptName, OptUserFrom.WebUI)).AddTradeMeta(trade.id, metaKey, dealNumber);
|
|
|
|
// LogFactory.GetLogger("招证").Info($"开始生成交易编号保存结果{dealNumber}");
|
|
}
|
|
return dealNumber;
|
|
|
|
}
|
|
|
|
/// <summary>
|
|
/// 生成招证期货报送成交编号
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
/// <exception cref="NotImplementedException"></exception>
|
|
private string GenerateZhaoZhengDealNumber(OtcTradeBase trade, string date, Func<string, string[]> excludeListInvoke = null)
|
|
{
|
|
var contractNo = "";
|
|
var prefix = GetZhaoZhengDealNumberPrefix(trade, date, out _);
|
|
var db = new YLContext();
|
|
var list = db.TradeMeta.Where(O => O.MetaKey.StartsWith("期货报送成交编号") && O.MetaValue.StartsWith(prefix)).Select(O => O.MetaValue).ToArray();
|
|
var count = list.Count();
|
|
if (excludeListInvoke != null)
|
|
{
|
|
var excludeList = excludeListInvoke(prefix);
|
|
list = list.Concat(excludeList).ToArray();
|
|
}
|
|
//LogFactory.GetLogger("招证").Info($"开始生成交易编号总数{count}");
|
|
do
|
|
{
|
|
count++;
|
|
contractNo = $"{prefix}{count:0000}";
|
|
// LogFactory.GetLogger("招证").Info($"开始生成交易编号最终生成:{contractNo}");
|
|
} while (list.Contains(contractNo));
|
|
return contractNo;
|
|
}
|
|
|
|
private static string GetZhaoZhengDealNumberPrefix(OtcTradeBase trade, string date, out Client client)
|
|
{
|
|
client = DataCacheProvider.GetClientDataSource().GetData(trade.ClientId)
|
|
?? throw new ServiceFaultException($"找不到客户信息,client id:{trade.ClientId},client name:{trade.ClientName}");
|
|
|
|
var tradeType = trade.TradeType switch
|
|
{
|
|
"收益互换" => "SW",
|
|
"远期" => "FW",
|
|
"现金流交易" => "OT",
|
|
_ => "OP",
|
|
};
|
|
return $"{tradeType}-{client.Number}-{date}";
|
|
}
|
|
}
|
|
} |