using BaseOUDAL;
using Confluent.Kafka;
using Org.BouncyCastle.Ocsp;
using Qdp.Pricing.Library.Base.Utilities;
using System.ComponentModel.DataAnnotations.Schema;
using System.Text;
using YieldChain.Helpers;
using YLErp.BLL;
using YLErp.CustomizedBizLogic;
using YLErp.DataBase;
using YLErp.DBModels;
using YLErp.DBModels.Attributes;
using YLErp.DBModels.Enums;
using YLErp.Helpers;
using YLErp.Model;
using YLErp.Model.Enum;
using YLErp.Models;
using YLErp.Modules.ClientModule.Constant;
using YLErp.Modules.EodModule.QueryModule;
using YLErp.Modules.SwapModule;
using YLErp.Modules.SystemModule;
namespace YLErp.Modules.ClientModule
{
///
/// 客户信息保存服务
///
public class ClientSaveService : ClientBaseService
{
public ClientSaveService(OptUserInfo userInfo) : base(userInfo)
{
}
public ClientSaveService(ClientBaseService baseService) : base(baseService)
{
}
///
/// 保存客户信息
///
///
/// 被更新的属性名称集合
/// 是否审批
public Client SaveData(Client req, HashSet updatedPropertyNameSet, out bool blAudit)
{
blAudit = false;
Client dbModel;
var oldName = string.Empty;
var isAddNew = req.id == 0;
var oldRiskServiceDegree = 0;
var changeList = new List>();
//多选框未选择时未赋值null,TryUpdateModel无法更新,特殊处理
req.ProtocolSignVersion = req.ProtocolSignVersion;
req.DerivativesInvestmentVarieties = req.DerivativesInvestmentVarieties;
req.TransactionTarget = req.TransactionTarget;
if (req.EvaluateDate != null && req.EvaluateOfValidity != null)
{
req.EvaluateExpireDate = ClientLinqExtendService.GetEvaluateDate(req.EvaluateDate, req.EvaluateOfValidity);
}
else
{
req.EvaluateExpireDate = null;
}
if (PS.Config.Is格林大华)
{
req.CustomerManager = req.CustomerManager;
req.CustomerManagerId = "";
}
else
{
if (!string.IsNullOrEmpty(req.CustomerManagerId))
{
if (req.CustomerManagerId.Contains(','))
{
var managerNames = new List();
var CustomerManagerIds = req.CustomerManagerId.Split(',').ToList();
CustomerManagerIds.ForEach(a =>
{
var manager = UserBLL.GetById(Convert.ToInt32(a));
if (manager != null)
{
managerNames.Add(manager.Name);
}
});
req.CustomerManager = managerNames.Any() ? string.Join(",", managerNames) : string.Empty;
}
else
{
var manager = UserBLL.GetById(Convert.ToInt32(req.CustomerManagerId));
req.CustomerManager = manager == null ? "" : manager.Name;
}
}
else
{
req.CustomerManager = null;
}
}
if ((PS.Config.Company == Configuration.CompanyEnum.浙期 && string.IsNullOrWhiteSpace(req.Number))
|| (PS.Config.Company == Configuration.CompanyEnum.国投))
{
BizLogicSingleton.Instance.GenerateClientCode(req, DbContext.client.AsNoTracking());
}
var clientCredit = yldb.credit.Where(x => x.ClientId == req.id).ToList();
var dbClient = new ClientDBContext();
if (clientCredit != null && clientCredit.Count > 0)
{
clientCredit.ForEach(x =>
{
x.ClientName = req.Name;
if (req.Number != null && string.IsNullOrWhiteSpace(req.Number)) { x.ClientNumber = req.Number; }
else
{
var clientModel = dbClient.client.First(c => c.id == req.id);
x.ClientNumber = clientModel.Number;
}
});
}
//当客户属性为自然人/产品时,客户性质为“不适用”
if (req.ClientType == ClientTypeEnum.自然人.ToString() || req.ClientType == ClientTypeEnum.产品.ToString())
{
req.InstitutionalAttributes = "不适用";
}
if (req.ClientType != ClientTypeEnum.产品.ToString())
{
req.ProductNumber = "";
req.AdminFullName = "";
}
if (!(req.ClientType == ClientTypeEnum.产品.ToString() || (req.ClientType == ClientTypeEnum.机构.ToString() && req.BusinessType == "私募管理人")))
{
req.AdminRegisteredNum = "";
}
if (req.ClientType == ClientTypeEnum.自然人.ToString())
{
req.RegisteredCapital = "";
req.RegisteredAddress = "";
}
if (PS.Config.ClientElement.IsCreditLimit)
{
req.IsTradeCredit = 1;
}
else
{
req.IsCreditOn = 1;
}
req.SwapTradeType = req.SwapTradeType ?? 0;
if (isAddNew)
{
req.ProcessStatus = "未提交";
req.ProcessOrderId = 0;
req.ProcessOptDate = DateTime.Now;
SetDBModelCreator(req);
CheckModel(req, req.Name, isAddNew);
DbContext.client.Add(dbModel = req);
}
else
{
dbModel = DbContext.client.Find(req.id);
if (dbModel == null)
{
throw new ServiceException("要更新的数据 已不存在");
}
changeList = DataChangeHelper.GetDataChanges(dbModel, req);
changeList = ClientDataChangeLogHandle.Handle(typeof(Client), changeList);
var changeRegisteredCapital = changeList.FirstOrDefault(n => n[0] == nameof(Client.RegisteredCapital));
if (changeRegisteredCapital != null && changeRegisteredCapital.Count > 0)
{
if (req.ClientType == "产品")
{
changeRegisteredCapital[1] = "产品规模(万元)";
}
else
{
changeRegisteredCapital[1] = "注册资本(万元)";
}
}
req.ProcessStatus = dbModel.ProcessStatus;
req.ProcessOrderId = dbModel.ProcessOrderId;
oldName = dbModel.Name;
CheckModel(req, oldName, isAddNew);
oldRiskServiceDegree = dbModel.RiskServiceDegree ?? 0;
//比较数据库数据和要更新的请求数据以确定是否重置为审批状态
if (CheckClientProcess(dbModel, req, updatedPropertyNameSet))
{
blAudit = true;
return dbModel;
}
ObjectHelper.MapValues(dbModel, req, updatedPropertyNameSet);
}
SetDBModelOpt(dbModel);
DbContext.SaveChanges();
//修改客户名时,需要同步修改该客户文件管理相关的文件夹名
//12/23 添加了FilePath,直接使用客户Id就能区分,当文件名仍然存在客户名称,就换成Id作文件名
if (!isAddNew && oldName != dbModel.Name)
{
var blackList = DbContext.client_black.Where(O => O.Name == oldName);
foreach (var item in blackList)
{
item.Name = dbModel.Name;
}
var oldClientPath = $"{dbModel.id}_{string.Join("", oldName.Where(O => !System.IO.Path.GetInvalidFileNameChars().Contains(O)))}";
var newClientPath = $"{dbModel.id}";
var oldFileSuitablyPath = OtcAppContext.MapPath($"~/App_Docs/ClientFiles/SuitablyFiles/{oldClientPath}");
var newFileSuitablyPath = OtcAppContext.MapPath($"~/App_Docs/ClientFiles/SuitablyFiles/{newClientPath}");
var oldFilePath = OtcAppContext.MapPath($"~/App_Docs/ClientFiles/{oldClientPath}");
var newFilePath = OtcAppContext.MapPath($"~/App_Docs/ClientFiles/{newClientPath}");
var oldHistoryFilePath = OtcAppContext.MapPath($"~/App_Docs/ClientFiles/{oldClientPath}/history");
var newHistoryFilePath = OtcAppContext.MapPath($"~/App_Docs/ClientFiles/{newClientPath}/history");
if (System.IO.Directory.Exists(oldFileSuitablyPath))
{
if (!System.IO.Directory.Exists(newFileSuitablyPath))
{
System.IO.Directory.Move(oldFileSuitablyPath, newFileSuitablyPath);
}
else
{
var paths = System.IO.Directory.GetFiles(oldFileSuitablyPath);
if (paths.Length > 0)
{
foreach (var path in paths)
{
var newPath = path.Replace(oldFileSuitablyPath, newFileSuitablyPath);
System.IO.File.Move(path, newPath);
}
}
}
}
if (System.IO.Directory.Exists(oldFilePath))
{
if (!System.IO.Directory.Exists(newFilePath))
{
System.IO.Directory.Move(oldFilePath, newFilePath);
}
else
{
var paths = System.IO.Directory.GetFiles(oldFilePath);
if (paths.Length > 0)
{
foreach (var path in paths)
{
var newPath = path.Replace(oldFilePath, newFilePath);
System.IO.File.Move(path, newPath);
}
}
}
}
if (System.IO.Directory.Exists(oldHistoryFilePath))
{
if (!System.IO.Directory.Exists(newHistoryFilePath))
{
System.IO.Directory.Move(oldHistoryFilePath, newHistoryFilePath);
}
else
{
var paths = System.IO.Directory.GetFiles(oldHistoryFilePath);
if (paths.Length > 0)
{
foreach (var path in paths)
{
var newPath = path.Replace(oldHistoryFilePath, newHistoryFilePath);
System.IO.File.Move(path, newPath);
}
}
}
}
}
//交易元数据
if (req.MetaDic.Any())
{
foreach (var kv in req.MetaDic)
{
if (isAddNew)
{
if (!string.IsNullOrEmpty(kv.Value))
{
AddMeta(false, dbModel.id, kv.Key, kv.Value);
}
}
else
{
var mete = AddOrUpdateMeta(false, dbModel.id, kv.Key, kv.Value);
if (mete != null && mete.Count > 0)
{
changeList.Add(mete);
}
}
}
}
DbContext.SaveChanges();
yldb.SaveChanges();
var changeStr = string.Empty;
if (req.id == 0)
{
AddClientOperationHistory(dbModel, "新增客户");
}
else if (req.id > 0)
{
changeStr = changeList.ToJson();
if (changeList != null && changeList.Count > 0)
{
AddClientOperationHistory(dbModel, "编辑客户", changeStr, true);
}
}
//增加评估日志
AddClientAssessmentLog(dbModel, changeStr, isAddNew);
SaveClientCustomerManage(dbModel.id,req.CustomerManagerId);
return dbModel;
}
///
/// 保存客户与客户服务人对应关系
///
///
///
private void SaveClientCustomerManage(int clientId,string customerManageIds)
{
var clientManagers = DbContext.client_customer_manage.Where(x=>x.ClientId==clientId);
DbContext.client_customer_manage.RemoveRange(clientManagers);
if (!string.IsNullOrEmpty(customerManageIds))
{
if (customerManageIds.Contains(','))
{
var managerNames = new List();
var CustomerManagerIds = customerManageIds.Split(',').ToList();
CustomerManagerIds.ForEach(a =>
{
var sysUserId=Convert.ToInt32(a);
ClientCustomerManage clientCustomer=new ClientCustomerManage();
clientCustomer.ClientId = clientId;
clientCustomer.SysuserId = sysUserId;
clientCustomer.create_time = DateTime.Now;
clientCustomer.create_user = UserId;
DbContext.client_customer_manage.Add(clientCustomer);
});
}
else
{
var sysUserId = Convert.ToInt32(customerManageIds);
ClientCustomerManage clientCustomer = new ClientCustomerManage();
clientCustomer.ClientId = clientId;
clientCustomer.SysuserId = sysUserId;
clientCustomer.create_time = DateTime.Now;
clientCustomer.create_user = UserId;
DbContext.client_customer_manage.Add(clientCustomer);
}
}
DbContext.SaveChanges();
}
///
/// 保存客户信息变更数据
///
///
/// 被更新的属性名称集合
/// 是否审批
public Client SaveEditData(Client req)
{
Client dbModel;
var oldName = string.Empty;
var isAddNew = req.id == 0;
var oldRiskServiceDegree = 0;
var changeList = new List>();
dbModel = DbContext.client.Find(req.id);
if (dbModel == null)
{
throw new ServiceException("要更新的数据 已不存在");
}
changeList = DataChangeHelper.GetDataChanges(dbModel, req);
changeList = ClientDataChangeLogHandle.Handle(typeof(Client), changeList);
oldName = dbModel.Name;
CheckModel(req, oldName, isAddNew);
oldRiskServiceDegree = dbModel.RiskServiceDegree ?? 0;
foreach (var kv in req.MetaDic)
{
var mete = AddOrUpdateMeta(false, dbModel.id, kv.Key, kv.Value);
if (mete != null && mete.Count > 0)
{
changeList.Add(mete);
}
}
ObjectHelper.MapValues(dbModel, req);
SetDBModelOpt(dbModel);
DbContext.SaveChanges();
//修改客户名时,需要同步修改该客户文件管理相关的文件夹名
//12/23 添加了FilePath,直接使用客户Id就能区分,当文件名仍然存在客户名称,就换成Id作文件名
if (oldName != dbModel.Name)
{
var blackList = DbContext.client_black.Where(O => O.Name == oldName);
foreach (var item in blackList)
{
item.Name = dbModel.Name;
}
var oldClientPath = $"{dbModel.id}_{string.Join("", oldName.Where(O => !System.IO.Path.GetInvalidFileNameChars().Contains(O)))}";
var newClientPath = $"{dbModel.id}";
var oldFileSuitablyPath = OtcAppContext.MapPath($"~/App_Docs/ClientFiles/SuitablyFiles/{oldClientPath}");
var newFileSuitablyPath = OtcAppContext.MapPath($"~/App_Docs/ClientFiles/SuitablyFiles/{newClientPath}");
var oldFilePath = OtcAppContext.MapPath($"~/App_Docs/ClientFiles/{oldClientPath}");
var newFilePath = OtcAppContext.MapPath($"~/App_Docs/ClientFiles/{newClientPath}");
var oldHistoryFilePath = OtcAppContext.MapPath($"~/App_Docs/ClientFiles/{oldClientPath}/history");
var newHistoryFilePath = OtcAppContext.MapPath($"~/App_Docs/ClientFiles/{newClientPath}/history");
if (System.IO.Directory.Exists(oldFileSuitablyPath))
{
if (!System.IO.Directory.Exists(newFileSuitablyPath))
{
System.IO.Directory.Move(oldFileSuitablyPath, newFileSuitablyPath);
}
else
{
var paths = System.IO.Directory.GetFiles(oldFileSuitablyPath);
if (paths.Length > 0)
{
foreach (var path in paths)
{
var newPath = path.Replace(oldFileSuitablyPath, newFileSuitablyPath);
System.IO.File.Move(path, newPath);
}
}
}
}
if (System.IO.Directory.Exists(oldFilePath))
{
if (!System.IO.Directory.Exists(newFilePath))
{
System.IO.Directory.Move(oldFilePath, newFilePath);
}
else
{
var paths = System.IO.Directory.GetFiles(oldFilePath);
if (paths.Length > 0)
{
foreach (var path in paths)
{
var newPath = path.Replace(oldFilePath, newFilePath);
System.IO.File.Move(path, newPath);
}
}
}
}
if (System.IO.Directory.Exists(oldHistoryFilePath))
{
if (!System.IO.Directory.Exists(newHistoryFilePath))
{
System.IO.Directory.Move(oldHistoryFilePath, newHistoryFilePath);
}
else
{
var paths = System.IO.Directory.GetFiles(oldHistoryFilePath);
if (paths.Length > 0)
{
foreach (var path in paths)
{
var newPath = path.Replace(oldHistoryFilePath, newHistoryFilePath);
System.IO.File.Move(path, newPath);
}
}
}
}
}
DbContext.SaveChanges();
yldb.SaveChanges();
var changeStr = string.Empty;
changeStr = changeList.ToJson();
if (changeList != null && changeList.Count > 0)
{
AddClientOperationHistory(dbModel, "编辑客户", changeStr, true);
}
//增加评估日志
AddClientAssessmentLog(dbModel, changeStr, isAddNew);
return dbModel;
}
private void AddClientOperationHistory(Client req, string optType, string Comments = null, bool isJson = false)
{
DbContext.ClientAuditLog.Add(new ClientAuditLog
{
ClientId = req.id,
OptType = optType,
Changes = Comments ?? string.Empty,
DataType = isJson ? "C02" : "00",
OptId = UserId,
OptName = UserName,
OptDate = OptDate
});
DbContext.SaveChanges();
}
private void AddClientAssessmentLog(Client newClient, string changeStr, bool isNew)
{
//新增与变更评估日期以及评估有效期时增加日志
if ((isNew && newClient.EvaluateDate != null && newClient.EvaluateOfValidity != null)
|| changeStr.Contains("EvaluateDate") || changeStr.Contains("EvaluateOfValidity"))
{
DbContext.ClientAuditLog.Add(new ClientAuditLog
{
ClientId = newClient.id,
OptType = "评估记录",
Changes = JsonHelper.ToJson(new ClientAssessmentLogModel
{
EvaluateDate = newClient.EvaluateDate == null ? string.Empty : newClient.EvaluateDate.Value.ToString("yyyy-MM-dd"),
EvaluateOfValidity = newClient.EvaluateOfValidity,
OptId = UserId,
OptName = UserName,
OptDate = OptDate.ToString("yyyy-MM-dd HH:mm:ss")
}),
DataType = "C02",
OptId = UserId,
OptName = UserName,
OptDate = OptDate
});
DbContext.SaveChanges();
}
}
private bool CheckClientProcess(Client dbModel, Client req, HashSet updatedPropertyNameSet)
{
var clientProcess = yldb.approvalprocess.Where(s => s.processType == "ClientProcess").ToList();
if (clientProcess.Count == 0)
{
return false;
}
var blAudit = dbModel.ProcessStatus == "已开户" || dbModel.ApprovalStatus == "审批中"
|| dbModel.ProcessStatus == "已休眠" || dbModel.ProcessStatus == "已销户";
if (!blAudit)
{
return false;
}
blAudit = true;
if (DbContext.bankcard.Where(b => b.ClientId == dbModel.id && b.ApprovalOrder != (int)ApprovalOrderEnum.无需审批 && b.ApprovalOrder != (int)ApprovalOrderEnum.审批作废).Any()
|| DbContext.clientduty.Where(b => b.ClientId == dbModel.id && b.ApprovalOrder != (int)ApprovalOrderEnum.无需审批 && b.ApprovalOrder != (int)ApprovalOrderEnum.审批作废).Any()
|| DbContext.client_file.Where(b => b.ClientId == dbModel.id && b.ApprovalOrder != (int)ApprovalOrderEnum.无需审批 && b.ApprovalOrder != (int)ApprovalOrderEnum.审批作废).Any())
{
blAudit = true;
}
//浙期每个字段更改都要审批
if (!blAudit && (PS.Config.Is浙期 || PS.Config.Company == Configuration.CompanyEnum.招证))
{
var update = updatedPropertyNameSet.Where(x => !x.Contains("][") && !x.Contains("meta_") && x != "HadPass");
foreach (var up in update)
{
if (!blAudit)
{
var notmapped = dbModel.GetType().GetProperty(up).GetCustomAttributes(typeof(NotMappedAttribute), false);
if (notmapped != null && notmapped.Length > 0)
{
continue;
}
var oldvalue = dbModel.GetType().GetProperty(up).GetValue(dbModel, null);
var newvalue = req.GetType().GetProperty(up).GetValue(req, null);
if ((oldvalue != null && newvalue != null && !oldvalue.Equals(newvalue)) || ((oldvalue == null || newvalue == null) && oldvalue != newvalue))
{
blAudit = true;
}
}
else
{
break;
}
}
foreach (var kv in req.MetaDic)
{
if (!blAudit)
{
var mete = AddOrUpdateMeta(false, dbModel.id, kv.Key, kv.Value);
if (mete != null && mete.Count > 0)
{
blAudit = true;
}
}
else
{
break;
}
}
}
if (blAudit)
{
if ("已休眠".Equals(dbModel.ProcessStatus))
{
var preAuditStatus = DbContext.ClientMeta.FirstOrDefault(p => p.ClientId == dbModel.id && p.MetaKey == ClientMetaKey.AuditPreStatus);
if (preAuditStatus == null)
{
preAuditStatus = new ClientMeta
{
ClientId = dbModel.id,
MetaKey = ClientMetaKey.AuditPreStatus,
MetaValue = dbModel.ProcessStatus,
OptId = UserId,
OptName = UserName,
OptDate = DateTime.Now
};
DbContext.ClientMeta.Add(preAuditStatus);
}
}
bool approvalBranch = clientProcess.Any(x => x.approvalGroupId != 0);//审批流程有分支情况
req.ProcessOrderBranch = 0;
req.ApprovalOrderId = ProcessTradeLog.审批中;
req.ApprovalOptDate = DateTime.Now;
req.ApprovalStatus = "审批中";
var groupId = UserBLL.GetApprovalProcessGroup(UserId);
if (approvalBranch)//审批流程有分支情况
{
//该审批组属于流程的审批组或该审批组不属于流程审批组
var tradeProessBranchQuery = clientProcess.FirstOrDefault(x => (x.approvalGroupId == groupId && x.approvalCondition == 1) || (x.approvalGroupId != groupId && x.approvalCondition == 2));
if (tradeProessBranchQuery == null)//都没有情况
{
throw new ServiceException("当前存在分支开户审批流程,检测到申请人不满足任意一个分支进入条件,无法提交审批,请更换申请人或调整审批组");
}
req.ApprovalOrderId = tradeProessBranchQuery.order > 1 ? 1 : tradeProessBranchQuery.order + 1;//第一个节点是分支需要跳过审批组那一级
req.ProcessOrderBranch = tradeProessBranchQuery.node ?? 1;//审批组分支
}
dbModel = DbContext.client.Find(req.id);
dbModel.ApprovalStatus = req.ApprovalStatus;
dbModel.ApprovalOrderId = req.ApprovalOrderId;
dbModel.ApprovalOptDate = req.ApprovalOptDate;
dbModel.ProcessOrderBranch = req.ProcessOrderBranch;
var clientAuditlog = new ClientAuditLog
{
ClientId = dbModel.id,
OptType = "提交信息变更审批",
DataType = "00",
OptId = UserId,
OptName = UserName,
OptDate = DateTime.Now
};
///日志记录
DbContext.ClientAuditLog.Add(clientAuditlog);
DbContext.SaveChanges();
dbModel.ApprovalLogId = clientAuditlog.id;
clientAuditlog.Changes = ClientHelper.Serialize(req);
var range = DbContext.client_file_audit.Where(x => x.ClientId == dbModel.id).ToList();
DbContext.client_file_audit.RemoveRange(range);
DbContext.SaveChanges();
}
return blAudit;
}
public void CheckModel(Client req, string blackNameForCheck, bool isAddNew)
{
if (string.IsNullOrWhiteSpace(req.Name))
{
throw new ServiceException("客户名称 必须填写");
}
//if (string.IsNullOrWhiteSpace(req.))
//{
// throw new ServiceException("自定义必须填写");
//}
//新增时,新的客户名如果在黑名单里,不允许新增
//修改时,旧的客户名如果在黑名单里,不允许修改
if (!isAddNew && !req.Name.Equals(blackNameForCheck) && DbContext.client_black.Any(x => x.Name == blackNameForCheck))
{
throw new ServiceException("该客户为黑名单客户," + (req.id > 0 ? "不允许修改客户名称" : "不允许新增"));
}
//字段唯一性验证(客户名称,客户代码,默认登录名)
if (DbContext.client.Any(x => x.id != req.id && x.Name == req.Name && x.ProcessStatus != "已销户"))
{
throw new ServiceException("客户名称不能重复");
}
if (DbContext.client.Any(x => x.id != req.id && x.Number == req.Number && !string.IsNullOrEmpty(req.Number)))
{
throw new ServiceException("客户编号不能重复");
}
if (!PS.Config.Is国泰君安 && PS.Config.ComponentVersion == Configuration.ComponentVersion.Broker)
{
if (DbContext.client.Any(x => x.id != req.id && x.Code == req.Code && !string.IsNullOrEmpty(req.Code)))
{
throw new ServiceException("客户代码不能重复");
}
}
if (DbContext.client.Any(x => x.id != req.id && x.DefaultLoginName == req.DefaultLoginName && !string.IsNullOrEmpty(req.DefaultLoginName)))
{
throw new ServiceException("默认登录名不能重复");
}
HashSet yldicSet;
using (var db = new ErpBaseContext())
{
yldicSet = db.Dictionaries.Where(n => db.DictionaryItems.Any(m => m.DictId == n.Id)).Select(n => n.Name).ToHashSet();
}
if (!yldicSet.Contains("行业"))
{
throw new ServiceException("请配置数据字典 行业");
}
if (!yldicSet.Contains("投资经验"))
{
throw new ServiceException("请配置数据字典 投资经验");
}
if (!yldicSet.Contains(PS.Config.Is中财 ? "投资知识" : "风险偏好"))
{
throw new ServiceException("请配置数据字典 " + (PS.Config.Is中财 ? "投资知识" : "风险偏好"));
}
if (!yldicSet.Contains("期望收益"))
{
throw new ServiceException("请配置数据字典 期望收益");
}
if (!yldicSet.Contains("适当性客户分类"))
{
throw new ServiceException("请配置数据字典 适当性客户分类");
}
if (!yldicSet.Contains("协议签署版本"))
{
throw new ServiceException("请配置数据字典 协议签署版本");
}
if (req.ParentId > 0 && req.id > 0 && Treeleveldata(req.id).Any(c => c.id == req.ParentId))
{
throw new ServiceException("所属机构不能选择下一层");
}
//存在已审批或审批中的资质评级
if (PS.Config.ClientElement.IsCreditLimit && req.IsCreditOn != 1 && DbContext.Client_Rating.Where(t => !t.IsDeleted && t.ClientId == req.id
&& (t.ProcessStatus == "已审批" || t.ProcessStatus == "审批中")
&& (!t.RatingDeadLine.HasValue || t.RatingDeadLine >= valuedateBLL.ValueDate)).Any())
{
throw new ServiceException("存在已审批或审批中的资质评级, 请先处理相关资质评级记录");
}
//存在已审批或审批中的授信
if (PS.Config.ClientElement.IsCreditLimit && req.IsCreditOn != 1 && yldb.credit.Where(t => t.ClientId == req.id && (t.ProcessStatus == "已审批" || t.ProcessStatus == "审批中") && (!t.CreditDeadLine.HasValue || t.CreditDeadLine >= valuedateBLL.ValueDate)).Any())
{
throw new ServiceException("存在已审批或审批中的授信, 客户期权费授信不能为否,请先处理相关授信记录");
}
////存在已审批或审批中的互换授信
//if (yldb.credit.Where(t => (t.DerivativesInvestmentVarieties != null && t.DerivativesInvestmentVarieties.Contains(((int)DerivativesInvestmentVarietiesEnum.场外期权).ToString())) && t.ClientId == req.id && (t.ProcessStatus == "已审批" || t.ProcessStatus == "审批中") && (!t.CreditDeadLine.HasValue || t.CreditDeadLine >= valuedateBLL.ValueDate)).Any())
//{
// if (req.BusinessType == null || !((req.BusinessType.Contains("银行") && "AAA".Equals(req.BankCreditRating)) || (req.BusinessType.Contains("证券") && req.SamePeer == 0)))
// {
// throw new ServiceException("存在已审批或审批中的互换授信, 客户不允许修改为非AAA银行或非同业交易商,请先处理相关授信记录!");
// }
//}
//产品用户投资者,如果存在收益互换权限 只有专业投资者权益百分比可以大于20%
if (req.ClientType == ClientTypeEnum.产品.ToString() && req.DerivativesInvestmentVarieties.Contains((int)DerivativesInvestmentVarietiesEnum.场外互换 + ""))
{
//获取产品投资人
var hasClientInvestors = DbContext.ClientInvestor.Where(t => t.ClientId == req.id && !t.EligibilityType.Equals("专业投资者") && t.ShareRate > 0.2);
if (hasClientInvestors != null && hasClientInvestors.Any())
{
throw new ServiceException("本产品客户,存在非专业投资人权益比例大于20%情况,无法进行场外互换交易!");
}
}
//if (req.ClientRight=="5")//行情及交易
//{
// if (string.IsNullOrEmpty(req.ProxyEmail))
// {
// throw new ServiceException("代理委托邮箱必填!");
// }
// if (string.IsNullOrEmpty(req.ProxyEmailPwd))
// {
// throw new ServiceException("邮箱授权码必填!");
// }
//}
var clientFields = isAddNew ? ClientEditConfigService.GetAllFormEditFieldByTableId("basic") : ClientEditConfigService.GetAllFormEditField();
clientFields = clientFields.Where(a => !string.IsNullOrEmpty(a.label) && !a.@readonly);
foreach (var field in clientFields)
{
if (field.name.Contains("meta_"))
{
var metaKey = field.name.Split('_')[1];
if (field.required && ((req.MetaDic.TryGetValue(metaKey, out var metaValue) && string.IsNullOrWhiteSpace(metaValue)) || !req.MetaDic.TryGetValue(metaKey, out metaValue)) && isAddNew)
{
throw new ServiceException($"{field.label} 必须填写");
}
}
else
{
var propertys = req.GetType().GetProperties();
var prop = propertys.Where(a => a.Name == field.name).FirstOrDefault();
if (prop != null && field.required)
{
if (prop.PropertyType == typeof(string))
{
if (string.IsNullOrWhiteSpace(prop.GetValue(req, null)?.ToString()))
{
throw new ServiceException($"{field.label} 必须填写");
}
}
else if (field.name== "TradingInstType"&& (TradingInstTypeEnum)prop.GetValue(req, null) == TradingInstTypeEnum.None)
{
throw new ServiceException($"{field.label} 必须填写");
}
else if (prop.GetValue(req, null) == null)
{
throw new ServiceException($"{field.label} 必须填写");
}
}
}
}
}
private List Treeleveldata(int clientid)
{
var resultList = new List();
var clientQuery = DataCacheProvider.GetClientDataSource().AsQueryable();
FoundChildNode(clientQuery, clientid, resultList, null);
return resultList;
}
private void FoundChildNode(IQueryable clientQuery, int parentId, List resultList, HashSet checkSet)
{
checkSet ??= new HashSet();
if (!checkSet.Add(parentId))
{
checkSet.Clear();
var pid = parentId;
var list = new List();
for (var i = 0; i < 100; i++)
{
if (pid <= 0 || !checkSet.Add(pid)) break;
var client = clientQuery.FirstOrDefault(n => n.id == pid);
if (client == null)
{
break;
}
else
{
list.Add(client.Name);
pid = client.ParentId;
}
}
if (list.Count > 0)
{
list.Add(list[0]);
}
throw new ServiceFaultException("客户父子关系产生了循环依赖:" + string.Join("->", list));
}
var childItems = clientQuery.Where(c => c.ParentId == parentId && c.id != parentId).ToList();
foreach (var child in childItems)
{
resultList.Add(child);
FoundChildNode(clientQuery, child.id, resultList, checkSet);
}
}
///
/// API
///
public Client SaveClientAPI(Client req)
{
if (req == null)
{
throw new ServiceException("参数错误");
}
if (string.IsNullOrWhiteSpace(req.Number))
{
req.id = 0;
}
else
{
var client = DbContext.client.FirstOrDefault(p => req.Number.Equals(p.Number));
req.id = client != null ? client.id : 0;
}
return new ClientSaveService(OptUser).SaveData(req, null, out bool blAudit);
}
///
/// API
///
///
public void CreateClient(CreateClientReq req)
{
if (req?.Client == null)
{
throw new ServiceException("参数错误:" + nameof(req.Client));
}
req.Client.id = 0;
req.Client.LevelId = DbContext.clientlevel.Where(c => c.LevelName == req.Client.Level).FirstOrDefault().id;
if (req.Client.SalesDepartmentId != null && req.Client.SalesDepartmentId > 0)
{
req.Client.SalesDepartmentId = GetAllSaleDepartment(req.Client.SalesDepartment);
}
if (!string.IsNullOrEmpty(req.Client.CustomerManager))
{
var managerNames = new List { req.Client.CustomerManager };
if (req.Client.CustomerManager.Contains(','))
{
managerNames = req.Client.CustomerManager.Split(',').ToList();
}
using var db = new ErpBaseContext();
var ids = db.SystemUsers.Where(n => managerNames.Contains(n.LoginName) || managerNames.Contains(n.Name)).Select(n => n.Id).ToArray();
req.Client.CustomerManagerId = string.Join(",", ids);
}
var client = new ClientSaveService(OptUser).SaveData(req.Client, null, out bool blAudit);
if (req.Bankcards != null && req.Bankcards.Any())
{
foreach (var item in req.Bankcards)
{
item.id = 0;
item.ClientId = client.id;
new ClientBankCardService(OptUser).SaveBankCard(item, out _);
}
}
if (req.ClientDutys != null && req.ClientDutys.Any())
{
foreach (var item in req.ClientDutys)
{
item.id = 0;
item.ClientId = client.id;
new ClientDutyService(OptUser).SaveClientDuty(item);
}
}
}
///
/// 获取归属营业部
///
///
///
public static int GetAllSaleDepartment(string SalesDepartment)
{
var SalesDepartmentId = 0;
using (var condb = new ErpBaseContext())
{
var list = condb.Departments.Where(x => x.DepartmentType == SalesDepartment).FirstOrDefault();
SalesDepartmentId = list.Id;
}
return SalesDepartmentId;
}
///
/// 修改外部编号
///
///
///
public void UpdateClientOutNumber(string clientNumber,string outNumer)
{
var client= DbContext.client.FirstOrDefault(x=>x.Number==clientNumber);
if (client!=null)
{
client.OutNumber= outNumer;
DbContext.SaveChanges();
}
}
///
/// 添加元数据
///
protected void AddMeta(bool saveChanges, int clientId, string metaKey, string metaValue)
{
DbContext.ClientMeta.Add(new ClientMeta
{
ClientId = clientId,
MetaKey = metaKey,
MetaValue = metaValue
});
if (saveChanges)
{
DbContext.SaveChanges();
}
}
///
/// 添加或更新元数据
///
protected List AddOrUpdateMeta(bool saveChanges, int clientId, string metaKey, string metaValue)
{
return new ClientMetaService(this).AddMeta(clientId, metaKey, metaValue, saveChanges);
}
}
public class CreateClientReq
{
public Client Client { get; set; }
public IEnumerable Bankcards { get; set; }
public IEnumerable ClientDutys { get; set; }
}
}