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

157 lines
6.1 KiB
C#

using YLErp.BLL;
using YLErp.Modules;
namespace YLErp.CustomizedBizLogic
{
public class BizLogicDongWu : BizLogicDefault
{
//客户编号+开仓日期YYMMDD+当日笔数+交易方向+标的分类
/// <summary>
/// 生成交易编号
/// </summary>
/// <param name="reqModel"></param>
/// <param name="db"></param>
/// <returns></returns>
public override string GenerateTradeNumberBeforeConfirm(TradeNumberReqModel reqModel, YLContext db)
{
//判断交易编号Model是否为空
if (reqModel is null)
{
throw new ArgumentNullException(nameof(reqModel));
}
//判断交易编号是否为空
if (!string.IsNullOrWhiteSpace(reqModel.trade.TradeNumber))
{
return reqModel.trade.TradeNumber;
}
//判断开仓时间是否为空
if (!reqModel.trade.TradeDate.HasValue)
{
throw new Exception("交易日期不存在,无法生成交易编号!");
}
string mark = "";
var um = DataCacheProvider.GetUnderlyingDataSource().GetData(reqModel.trade.UnderlyingCode);
if (um != null && (um.IsStock() || um.IsStockIF() || um.IsStockIndex()))
{
mark = "EQU";
}
else
{
mark = "COM";
}
string code = "";
//根据客户Id查询出来该条数据
var client = DbContextFactory.GetClientDbContext(null).client.Where(x => x.id == reqModel.clientId).FirstOrDefault();
if (client == null)
{
throw new Exception("未找到客户");
}
//取出客户编号
string clientNumber = client.Number;
//取出当前开仓时间
string tradeDate = reqModel.trade.TradeDate?.ToString("yyMMdd");
string Separator = "-";
//当日交易笔数
code = $"{ clientNumber}{Separator}{tradeDate}";
//定义交易方向变量
var transaction = "";
if (reqModel.trade.TradeType == "收益互换")
{
transaction =
(reqModel.trade.trade_swap.GetTradePrice ?? 0) - (reqModel.trade.trade_swap.PayTradePrice ?? 0) == 0
? (reqModel.trade.trade_swap.IsPayFloatingProfit ? "-B-" : "-S-")
: ((reqModel.trade.trade_swap.GetTradePrice ?? 0) - (reqModel.trade.trade_swap.PayTradePrice ?? 0) > 0
? "-B-"
: "-S-");
}
else if (reqModel.trade.TradeType == "远期")
{
//判断远期期权多头/空头
if (reqModel.trade.OptionType == "看涨")
{
transaction = "-B-";
}
else
{
transaction = "-S-";
}
}
else
{
//交易方向
transaction = reqModel.trade.BuySell == "买入" ? "-S-" : "-B-";
}
var tradeNumbers = new List<string>();
tradeNumbers = db.trade.Where(x => x.TradeNumber.StartsWith(code) && x.TradeNumber.Contains(transaction) && x.ParentTradeId == 0).Select(x => x.TradeNumber).ToList();
//获取导入
if (reqModel.importTrades != null)
{
tradeNumbers.AddRange(reqModel.importTrades.Where(O => string.IsNullOrEmpty(O.TradeNumber)).Select(O => O.TradeNumber));
}
string ergodic = "";
//当前笔数
int number = tradeNumbers.Count;
do
{
number++;
ergodic = code + number.ToString("-000") + transaction + mark;
if (!tradeNumbers.Contains(ergodic))
{ break; }
} while (true);
return ergodic;
}
/// <summary>
/// 生成客户编号
/// </summary>
/// <param name="clientObj"></param>
/// <param name="clientDbQuery"></param>
public override void GenerateClientCode(DBModels.Client clientObj, IQueryable<DBModels.Client> clientDbQuery)
{
//判断客户编号是否为空
if (!string.IsNullOrEmpty(clientObj.Number)) { return; }
lock (clientDbQuery)
{
//定义变量
string code = "";
string codePrefix = "";
if (clientObj.IsInsided == 1)
{
codePrefix = "D";
}
else
{
if (clientObj.ClientType == "机构")
{
codePrefix = "E";
}
else if (clientObj.ClientType == "产品")
{
if (string.IsNullOrWhiteSpace(clientObj.Abbreviation)) { throw new ServiceException("客户类型为产品时,简称不能为空"); }
codePrefix = "F";
}
else
{
throw new ServiceException("客户选择客户类别,当前仅支持[结构/产品],请重新设定!");
}
}
//根据客户编号将该类型都查询出来
var existingClientCodes = clientDbQuery.Where(x => x.Number.StartsWith(codePrefix)).Select(x => x.Number).ToList();
int number = existingClientCodes.Count;
do
{
number++;
code = codePrefix + number.ToString("0000");
//如果是产品则后面会加上客户简称
if (codePrefix == "F")
{
code = code + "-" + clientObj.Abbreviation;
}
if (!existingClientCodes.Contains(code))
{ break; }
} while (true);
clientObj.Number = code;
}
}
}
}