Files
2024-05-09 14:06:26 +08:00

186 lines
9.2 KiB
C#

using System.Text.RegularExpressions;
using YLErp.BLL;
using YLErp.Modules;
namespace YLErp.CustomizedBizLogic
{
public class BizLogicGT : BizLogicDefault
{
/*
《交易确认书》编码规则为:“协议类型”-“机构类型”-“交易对手方编号” -“业务部门编号”-“业务类型”-“交易达成日期”(8 位数字,日期格式为 YYYYMMDD)
*/
private readonly string _SAC = "SAC";//协议类型
public override string GenerateTradeNumberBeforeConfirm(TradeNumberReqModel reqModel, YLContext db)
{
if (reqModel is null)
{
throw new ArgumentNullException(nameof(reqModel));
}
if (reqModel.trade.TradeDate == null)
{
throw new Exception("生成合同编号失败,请先确认该交易成交日期!");
}
if (!string.IsNullOrWhiteSpace(reqModel.trade.TradeNumber)) { return reqModel.trade.TradeNumber; }
string code = "";
using (var clientDB = DbContextFactory.GetClientDbContext(null))
{
var client = clientDB.client.Where(a => a.id == reqModel.clientId).FirstOrDefault();
if (client == null)
{
throw new Exception("未找到客户!");
}
var trade = reqModel.trade;
var um = DataCacheProvider.GetUnderlyingDataSource().GetData(trade.UnderlyingCode);
client.MetaDic = clientDB.ClientMeta.AsNoTracking().Where(t => t.ClientId == reqModel.clientId)
.Select(n => new { n.MetaKey, n.MetaValue }).ToDictionary(n => n.MetaKey, n => n.MetaValue);
if (!client.MetaDic.Any(a => a.Key.Contains("OrganizationType")))
{
throw new Exception($"请设置【{client.Name}】客户【机构类型】属性");
}
if (!client.MetaDic.Any(a => a.Key.Contains("BusinessDeptCode")))
{
throw new Exception($"请设置【{client.Name}】客户【业务部门编号】属性");
}
if (!client.MetaDic.Any(a => a.Key.Contains("ClientCode")))
{
throw new Exception($"请设置【{client.Name}】客户【客户代码】属性");
}
//当等于远期时,判断是否累计转的,如果是远期编号规则 -> 当前累计转的远期数量+ 用累计的交易编号
if (reqModel.trade.TradeType == "远期" && reqModel.trade.MetaDic.TryGetValue("累计期权交易编号",out var accumulatorTradeNumber) && !string.IsNullOrEmpty(accumulatorTradeNumber))
{
var accumulatorTrade = db.trade.FirstOrDefault(n => n.TradeNumber == accumulatorTradeNumber);
var forwardTradeCount = db.autocall_observation.Where(n => n.TradeId == accumulatorTrade.id && n.SettlementMode.Contains("转远期")).Count();
var newForwardTradeNumber = $"L{(forwardTradeCount + 1)}-{accumulatorTradeNumber}";
return newForwardTradeNumber;
}
string OrganizationType = client.MetaDic["OrganizationType"];//机构类型
string BusinessDeptCode = client.MetaDic["BusinessDeptCode"];//业务部门编号
string ClientCode = client.MetaDic["ClientCode"];//客户代码
string BuinessType = trade.TradeType == "远期" ? "SW" : "OP";
code = $"{_SAC}-{OrganizationType}-{ClientCode}-{BusinessDeptCode}-{BuinessType}-{trade.TradeDate?.ToString("yyyyMMdd")}";
var tradeNumbers = new List<string>();
tradeNumbers = db.trade.Where(x => x.TradeDate == trade.TradeDate && x.ParentTradeId == 0).Select(x => x.TradeNumber).ToList();
//获取导入
if (reqModel.importTrades != null)
{
tradeNumbers.AddRange(reqModel.importTrades.Select(O => O.TradeNumber));
}
var number = tradeNumbers.Count;
do
{
number++;
code = $"{code}-{number:0000}";
if (!tradeNumbers.Contains(code))
{ break; }
} while (true);
}
return code;
}
public override void GenerateClientCode(Client clientObj, IQueryable<Client> clientDbQuery)
{
lock (_clientCodeLock)
{
using (var db = DbContextFactory.GetClientDbContext(null))
{
if ((!clientObj.MetaDic.Any(a => a.Key.Contains("ClientCode"))) ||
string.IsNullOrEmpty(clientObj.MetaDic["ClientCode"])
)
{
var code = "";
int number = 0000;
var numberList = db.ClientMeta.Where(a => a.MetaKey.Contains("ClientCode")).Select(x => x.MetaValue).ToList();
if (numberList.Any())
{
var existingClientCodes = numberList.Where(x => Regex.IsMatch(x, @"^\d{4}$"));
int maxNumber = Convert.ToInt32(existingClientCodes.Max(x => x));
number = maxNumber > number ? maxNumber : number;
}
do
{
number++;
code = number.ToString("0000");
if (!numberList.Contains(code))
{ break; }
} while (true);
clientObj.MetaDic["ClientCode"] = code;
}
if (string.IsNullOrEmpty(clientObj.Number))
{
var code = "";
int number = 0;
string year = DateTime.Now.ToString("yyyy");
var numberList = clientDbQuery.Where(x => !string.IsNullOrEmpty(x.Number)).Select(x => x.Number).ToList();
if (numberList.Any())
{
var existingClientCodes = numberList.Where(x => Regex.IsMatch(x, @"^\d{7}$") && x.Contains(year)).Select(x => x.Substring(4));
int maxNumber = Convert.ToInt32(existingClientCodes.Max(x => x));
number = maxNumber > number ? maxNumber : number;
}
do
{
number++;
code = year + number.ToString("000");
if (!numberList.Contains(code))
{ break; }
} while (true);
clientObj.Number = code;
}
if (!clientObj.MetaDic.Any(a => a.Key.Contains("OrganizationType")))
{
throw new Exception($"请设置【{clientObj.Name}】客户【机构类型】属性");
}
if (!clientObj.MetaDic.Any(a => a.Key.Contains("BusinessDeptCode")))
{
throw new Exception($"请设置【{clientObj.Name}】客户【业务部门编号】属性");
}
if (!clientObj.MetaDic.Any(a => a.Key.Contains("AdditionalProtocolDate")))
{
throw new Exception($"请设置【{clientObj.Name}】客户【附加协议生效日期】属性");
}
if (!clientObj.MetaDic.Any(a => a.Key.Contains("WorkType")))
{
throw new Exception($"请设置【{clientObj.Name}】客户【业务类型】属性");
}
string OrganizationType = clientObj.MetaDic["OrganizationType"];//机构类型
string BusinessDeptCode = clientObj.MetaDic["BusinessDeptCode"];//业务部门编号
string AdditionalProtocolDate = clientObj.MetaDic["AdditionalProtocolDate"];//附加协议生效日期
string WorkType = clientObj.MetaDic["WorkType"];//业务类型
if (string.IsNullOrEmpty(clientObj.MainProtocolCode))
{
clientObj.MainProtocolCode = $"{_SAC}-{OrganizationType}-{clientObj.MetaDic["ClientCode"]}";
}
var dateAp = new DateTime();
DateTime.TryParse(AdditionalProtocolDate, out dateAp);
if (string.IsNullOrEmpty(clientObj.SupProtocolCode))
{
clientObj.SupProtocolCode = $"{_SAC}-{OrganizationType}-{clientObj.MetaDic["ClientCode"]}-A-{dateAp.ToString("yyyyMMdd")}";
}
if (string.IsNullOrEmpty(clientObj.AgreementBookNo))
{
clientObj.AgreementBookNo = $"{_SAC}-{OrganizationType}-{clientObj.MetaDic["ClientCode"]}-M-{dateAp.ToString("yyyyMMdd")}-{BusinessDeptCode}-{WorkType}";
}
}
}
}
}
}