Files
zszq-trs/YLErpDAL/CustomizedBizLogic/BizLogicZhaoZheng.cs
T
2024-05-09 14:06:26 +08:00

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}";
}
}
}