123 lines
6.1 KiB
C#
123 lines
6.1 KiB
C#
using YLErp.BLL;
|
|
using YLErp.Modules;
|
|
|
|
namespace YLErp.CustomizedBizLogic
|
|
{
|
|
public class BizLogicGXJY : BizLogicDefault
|
|
{
|
|
|
|
/// <summary>
|
|
/// 生成客户编号
|
|
/// 生成规则:客户编号 CW21000001, CW开头,21代表年份,21年签约的客户,后面6位是累加。
|
|
/// </summary>
|
|
/// <param name="initialCode">客户创建时的初始编号,如果没有传null</param>
|
|
public override void GenerateClientCode(Client clientObj, IQueryable<Client> clientDbQuery)
|
|
{
|
|
const string prefix = "CW";
|
|
|
|
const int leftPartSize = 4;//CW+year
|
|
|
|
if (string.IsNullOrWhiteSpace(clientObj.Number) || clientObj.Number.IndexOf(prefix) != 0)
|
|
{
|
|
lock (_clientCodeLock)
|
|
{
|
|
var leftPart = prefix + DateTime.Now.Year.ToString().Substring(2,2);
|
|
var existingNumbers = clientDbQuery.Where(x => x.Number.StartsWith(leftPart)).Select(x => x.Number).ToArray();
|
|
var maxNumber = 0;
|
|
if (existingNumbers.Any())
|
|
{
|
|
maxNumber = existingNumbers.Max(x => int.TryParse(x.Substring(leftPartSize), out var number) ? number : 0);
|
|
}
|
|
clientObj.Number = leftPart + (maxNumber + 1).ToString().PadLeft(6, '0');
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 在交易确认前生成交易编号
|
|
/// </summary>
|
|
public override string GenerateTradeNumberBeforeConfirm(TradeNumberReqModel reqModel, YLContext db)
|
|
{
|
|
if (reqModel is null)
|
|
{
|
|
throw new ArgumentNullException(nameof(reqModel));
|
|
}
|
|
|
|
//对于对冲交易、场内交易等没有设置客户的
|
|
if (reqModel.clientId == 0)
|
|
{
|
|
return DateTime.Now.ToString("yyyyMMddHHmmssfff");
|
|
}
|
|
|
|
var clientMainProtocolCode = DataCacheProvider.GetClientDataSource().GetData(reqModel.clientId)?.MainProtocolCode.TrimToNull();
|
|
if (string.IsNullOrEmpty(clientMainProtocolCode))
|
|
{
|
|
throw new ServiceException("找不到该数据主协议编号");
|
|
}
|
|
string preTag = clientMainProtocolCode ?? "N";
|
|
//合并起来作为获取递增序号的取值条件
|
|
var leftPart = preTag ;
|
|
var fullSize = leftPart.Length + 3;
|
|
|
|
//获取数据库该用户最大的交易编号记录
|
|
var tradeNumbers = db.trade.Where(x => x.TradeNumber.StartsWith(leftPart) && x.TradeNumber.Length >= fullSize)
|
|
.OrderByDescending(x => x.TradeNumber).Select(n => n.TradeNumber).ToList() ;
|
|
var numberStrings = tradeNumbers.Select(x => x.Substring(leftPart.Length).IndexOf('-')>0? x.Substring(leftPart.Length).Remove(x.Substring(leftPart.Length).IndexOf('-')): x.Substring(leftPart.Length)).Where(x => int.TryParse(x, out var num));
|
|
var number = numberStrings.LongCount()>0? numberStrings.Max(x => int.TryParse(x,out int a)?a:0):0;
|
|
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;
|
|
int importNumber = int.TryParse(importTradeNumber, out var i) ? i : 0;
|
|
number = number> importNumber ? number : importNumber;
|
|
}
|
|
|
|
//获取总的该用户最大的交易编号记录
|
|
int newNumber = number==0 ? 1 : (number + 1);
|
|
//获取提前终止数量
|
|
|
|
var tradeUnwindConfirmationNumbers = db.trade_contract_r.Where(l => l.TradeNumber.StartsWith(leftPart) && l.TradeNumber.Length >= fullSize && l.Type == "提前终止确认书" && l.IsValid).Select(n => n.ContractCode).ToList();
|
|
var tradeUnwindConfirmationNumberStrings = tradeUnwindConfirmationNumbers.Select(x => x.Contains(leftPart) ? (x.Substring(leftPart.Length).IndexOf('-') > 0 ? x.Substring(leftPart.Length).Remove(x.Substring(leftPart.Length).IndexOf('-')) : x.Substring(leftPart.Length)) : "1").Where(x => int.TryParse(x, out var num));
|
|
var tradeUnwindConfirmationCount = tradeUnwindConfirmationNumberStrings.Max(x => x);
|
|
if (newNumber > (string.IsNullOrWhiteSpace(tradeUnwindConfirmationCount) ? 0 : (int.Parse(tradeUnwindConfirmationCount) + 1)))
|
|
{
|
|
return getTradeNumber(newNumber, leftPart, db);
|
|
}
|
|
else
|
|
{
|
|
return getTradeNumber(int.Parse(tradeUnwindConfirmationCount) + 1, leftPart, db);
|
|
}
|
|
|
|
}
|
|
|
|
private string getTradeNumber(int newNumber, string leftPart, YLContext db)
|
|
{
|
|
if (newNumber < 1e3)
|
|
{
|
|
var childTradeNumberPart = leftPart + newNumber.ToString("D3") ;
|
|
if (db.trade.Any(x => x.TradeNumber.Contains(childTradeNumberPart)&& db.trade_contract_r.Any(l => l.ContractCode.Contains(childTradeNumberPart) && l.Type == "提前终止确认书" && l.IsValid) && x.ValidState != "InValid"))
|
|
{
|
|
return getTradeNumber(newNumber + 1, leftPart, db);
|
|
}
|
|
else
|
|
{
|
|
return leftPart + newNumber.ToString("D3");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
var childTradeNumberPart = leftPart + newNumber;
|
|
if (db.trade.Any(x => x.TradeNumber.Contains(childTradeNumberPart) && db.trade_contract_r.Any(l => l.ContractCode.Contains(childTradeNumberPart) && l.Type == "提前终止确认书" && l.IsValid) && x.ValidState != "InValid"))
|
|
{
|
|
return getTradeNumber(newNumber + 1, leftPart, db);
|
|
}
|
|
else
|
|
{
|
|
return childTradeNumberPart;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|