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

126 lines
6.2 KiB
C#

using YLErp.BLL;
using YLErp.Modules;
using static YLErp.ConsGlobal;
namespace YLErp.CustomizedBizLogic
{
public class BizLogicHaiTong : BizLogicDefault
{
public override string GenerateTradeNumberBeforeConfirm(TradeNumberReqModel reqModel, YLContext db)
{
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("交易日期不存在,无法生成交易编号!"); }
lock (_clientCodeLock)
{
string leftPart = "";
string RightPart = "";
string DatePart = "";
var stockInstrumentTypes = new[] { InstrumentType.Stock, InstrumentType.StockIF, InstrumentType.StockIndex };
var um = DataCacheProvider.GetUnderlyingDataSource().GetData(reqModel.trade.UnderlyingId);
//权益类场外交易编号处理
//交易编号前缀优化,动态获取当前年份后2位
var y = DateTime.Now.Year.ToString().Substring(2);
if (um != null && stockInstrumentTypes.Contains(um.UnderlyingInstrumentType))
{
leftPart = y + "W02";
}
else
{
leftPart = y + "W01";
}
DatePart = reqModel.trade.TradeDate?.ToString("MMdd");
leftPart += DatePart;
if (!string.IsNullOrWhiteSpace(reqModel.trade.StructureType) && reqModel.trade.TradeType != "自定义交易" && reqModel.trade.TradeType != "远期" || reqModel.trade.IsGroup == 1)
{
RightPart = "Z";
}
else if (reqModel.trade.TradeType == "香草期权")
{
RightPart = "X";
}
else
{
RightPart = "Q";
}
var fullSize = leftPart.Length + 3 + RightPart.Length;
var num = db.trade.Where(x => x.TradeNumber.Substring(leftPart.Length - 4, 4) == DatePart && x.TradeDate == reqModel.trade.TradeDate).Select(x => x.TradeNumber.Substring(leftPart.Length, 3)).OrderByDescending(x => x).FirstOrDefault();
int count = string.IsNullOrWhiteSpace(num) ? 0 : Convert.ToInt32(num);
if (reqModel.importTrades != null && reqModel.importTrades.Any())
{
//获取导入交易中该客户的交易编号记录
var numCount = reqModel.importTrades.Where(x => x.TradeNumber.Substring(leftPart.Length - 4, 4) == DatePart && x.TradeDate == reqModel.trade.TradeDate).Select(x => x.TradeNumber.Substring(leftPart.Length, 3)).OrderByDescending(x => x).FirstOrDefault();
int importCount = string.IsNullOrWhiteSpace(numCount) ? 0 : Convert.ToInt32(numCount);
count = count + importCount;
}
int newNumber = count + 1;
////获取数据库该用户最大的交易编号记录
//var tradeNumber = db.trade.Where(x => x.TradeNumber.StartsWith(leftPart) && x.TradeNumber.EndsWith(RightPart) && x.TradeNumber.Length == fullSize)
//.OrderByDescending(x => x.TradeNumber).Select(n => n.TradeNumber).FirstOrDefault() ?? string.Empty;
//if (reqModel.importTrades != null && reqModel.importTrades.Any())
//{
// //获取导入交易中该客户最大的交易编号记录
// var importTradeNumber = reqModel.importTrades.Where(x => x.TradeNumber.StartsWith(leftPart) && x.TradeNumber.Length == fullSize)
// .OrderByDescending(x => x.TradeNumber).Select(n => n.TradeNumber).FirstOrDefault() ?? string.Empty;
// tradeNumber = tradeNumber.CompareTo(importTradeNumber) > 0 ? tradeNumber : importTradeNumber;
//}
////获取总的该用户最大的交易编号记录
//int newNumber = string.IsNullOrWhiteSpace(tradeNumber) ? 1 : (int.Parse(tradeNumber.Substring(leftPart.Length, 3)) + 1);
if (newNumber < 1e4)
{
return leftPart + newNumber.ToString("D3") + RightPart;
}
else
{
throw new Exception("该客户存在最大交易编号" + (newNumber - 1) + ",超出了限制规则9999,生成交易编号失败");
}
}
}
public override void GenerateClientCode(Client clientObj, IQueryable<Client> clientDbQuery)
{
if (!string.IsNullOrEmpty(clientObj.Number)) { return; }
lock (_clientCodeLock)
{
string code = "";
string codePrefix = "";
if (string.IsNullOrWhiteSpace(clientObj.ProperClientClass))
{
throw new ServiceException("客户适当性类型 必须填写");
}
if (clientObj.ProperClientClass.Contains("专业投资者"))
{ codePrefix = "F"; }
else if (clientObj.ProperClientClass.Contains("普通投资者"))
{ codePrefix = "C"; }
else if (clientObj.ProperClientClass.Contains("公司内部"))
{ codePrefix = "H"; }
else
{
throw new Exception("适当性类型超出预期,当前仅支持[专业投资者/普通投资者/公司内部],请重新设定!");
}
var existingClientCodes = clientDbQuery.Where(x => x.ProperClientClass == clientObj.ProperClientClass).Select(x => x.Number).ToList();
int number = existingClientCodes.Count;
do
{
number++;
code = codePrefix + number.ToString("0000");
if (!existingClientCodes.Contains(code))
{ break; }
} while (true);
clientObj.Number = code;
}
}
}
}