157 lines
6.1 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|
|
}
|