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

131 lines
5.0 KiB
C#

using YLErp.BLL;
using YLErp.Modules;
namespace YLErp.CustomizedBizLogic
{
public class BizLogicWCZD : BizLogicDefault
{
/// <summary>
/// 生成客户编号 -- 物产中大
/// </summary>
/// <param name="initialCode">客户创建时的初始编号,如果没有传null</param>
public override void GenerateClientCode(Client clientObj, IQueryable<Client> clientDbQuery)
{
if (string.IsNullOrWhiteSpace(clientObj.Number))
{
lock (_clientCodeLock)
{
var result = DateTime.Now.Year.ToString();
var existingClientCodes = clientDbQuery.Where(x => x.Number.StartsWith(result)).Select(x => x.Number).ToList();
var maxNumber = 0;
if (existingClientCodes.Count > 0)
{ maxNumber = existingClientCodes.Max(x => ParseNumber(x.Substring(4))); }
var nextNum = maxNumber + 1;
if (nextNum < 1000)
{
result += nextNum.ToString("D3");
}
else
{
//如果大于999,将生成20181000等字符串,需求是说不会大于1000的
result += nextNum.ToString();
}
clientObj.Number = result;
}
}
}
/// <summary>
/// 在交易确认前生成交易编号
/// </summary>
public override string GenerateTradeNumberBeforeConfirm(TradeNumberReqModel reqModel, YLContext db)
{
if (reqModel is null)
{
throw new ArgumentNullException(nameof(reqModel));
}
var tradeNumber = "";
var client = DataCacheProvider.GetClientDataSource().GetData(reqModel.clientId);
if (reqModel.trade.TradeType == "结构化交易" && reqModel.trade.IsGroup == 0)
{
tradeNumber = GetTradeNumber(db, client.Number);
}
else
{
var result = $"{reqModel.trade.TradeDate.Value.ToString("yyyyMMdd")}-";
tradeNumber = GetTradeNumber(db, result);
}
if (reqModel.trade.SubTrades==null)
{
reqModel.trade.MetaDic["期货报送成交编号"] = GenerateWCZDNumber(db, reqModel.trade, reqModel.trade.TradeDate, 0, false);
}
return tradeNumber;
}
private static string GetTradeNumber(YLContext db, string result)
{
//获取数据库该用户最大的交易编号记录
var tradeNumbers = db.trade.Where(x => x.TradeNumber.ToUpper().StartsWith(result.ToUpper()) && x.ValidState != "InValid").Select(O => O.TradeNumber).OrderByDescending(O => O).ToList();
var tradeNumber = tradeNumbers.FirstOrDefault();
if (string.IsNullOrWhiteSpace(tradeNumber) || !int.TryParse(tradeNumber.Substring(result.Length).Split('-')[0], out var tradeCount))
{
tradeCount = 0;
}
do
{
tradeCount++;
tradeNumber = $"{result}{tradeCount.ToString("000")}";
} while (tradeNumbers.Contains(tradeNumber));
return tradeNumber;
}
/// <summary>
/// 生成监管报送里面的成交编号 存入trademate
/// </summary>
/// <returns></returns>
public string GenerateWCZDNumber(YLContext db, OtcTradeBase trade, DateTime? date, int keyId,bool isSaveMate = true,int leg=0)
{
string strTradeDate = date?.ToString("yyyyMMdd")+"-";
string metaKey = "期货报送成交编号" + keyId;
var tradeNumber = "";
if (keyId>0 && db.TradeMeta.Where(l=>l.MetaKey == metaKey).Any())
{
return db.TradeMeta.Where(l => l.MetaKey == metaKey).First().MetaValue;
}
var tradeMetas = db.TradeMeta.Where(O => O.MetaValue.StartsWith(strTradeDate) && O.MetaKey.StartsWith("期货报送成交编号"));
var tradeMetaNumbers = tradeMetas.Select(O => O.MetaValue);
var num = tradeMetas.ToList().Count+ leg;
do
{
num++;
tradeNumber = $"{strTradeDate}{num.ToString("000")}";
} while (tradeMetaNumbers.Contains(tradeNumber));
if (isSaveMate)
{
TradeMeta meta = new TradeMeta
{
TradeId = trade.id,
MetaKey = metaKey,
MetaValue = tradeNumber,
CreateTime = DateTime.Now
};
db.TradeMeta.Add(meta);
db.SaveChanges();
}
return tradeNumber;
}
private int ParseNumber(string clientNumber)
{
int.TryParse(clientNumber, out var number);
return number;
}
}
}